微信小程序JS报错:Uncaught TypeError: Converting circular structure to JSON

今天开发微信小程序调用setData时遇到一个JSON.stringify转换一个循环引用结构的报错。

setData工作原理
小程序的视图层目前使用 WebView 作为渲染载体,而逻辑层是由独立的 JavascriptCore 作为运行环境。在架构上,WebView 和 JavascriptCore 都是独立的模块,并不具备数据直接共享的通道。当前,视图层和逻辑层的数据传输,实际上通过两边提供的 evaluateJavascript 所实现。即用户传输的数据,需要将其转换为字符串形式传递,同时把转换后的数据内容拼接成一份 JS 脚本,再通过执行 JS 脚本的形式传递到两边独立环境。
而 evaluateJavascript 的执行会受很多方面的影响,数据到达视图层并不是实时的。同一进程内的 WebView 实际上会共享一个 JS VM,如果 WebView 内 JS 线程正在执行渲染或其他逻辑,会影响 evaluateJavascript 脚本的实际执行时间,另外多个 WebView 也会抢占 JS VM 的执行权限;另外还有 JS 本身的编译执行耗时,都是影响数据传输速度的因素。

其实就是setData(object)时会调用JSON.stringify

循环应用例子:

var a = {}
a.b = a

JSON.stringify无法转换这种结构,所以报错。

如果非要这样写,可以改成:

var a = {}
a.b = JSON.parse(JSON.stringify(a))

参考:
Chrome sendrequest error: TypeError: Converting circular structure to JSON
微信小程序官方文档:优化建议

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,251评论 4 61
  • 一、js和Android调用的前提 在讲js和Android的互调之前,我们要先设置好webview的一些基本配置...
    Hawkinswang阅读 7,923评论 0 14
  • 前言 Web 页面中的 JS 与 iOS Native 如何交互是每个 iOS 猿必须掌握的技能。而说到 Nati...
    幽城88阅读 2,245评论 1 8
  • fdlso阅读 117评论 0 0
  • 水陆草木之花,可爱者甚蕃。晋陶渊明独爱菊;自李唐来,世人盛爱牡丹;予独爱莲之出淤泥而不染,濯清涟而不妖,中...
    Candy喵小姐阅读 503评论 0 5