今天開發(fā)微信小程序調(diào)用setData
時遇到一個JSON.stringify
轉(zhuǎn)換一個循環(huán)引用結(jié)構(gòu)的報錯油狂。
setData工作原理
小程序的視圖層目前使用 WebView 作為渲染載體甘邀,而邏輯層是由獨立的 JavascriptCore 作為運行環(huán)境琅坡。在架構(gòu)上,WebView 和 JavascriptCore 都是獨立的模塊跌前,并不具備數(shù)據(jù)直接共享的通道钮糖。當(dāng)前,視圖層和邏輯層的數(shù)據(jù)傳輸枢析,實際上通過兩邊提供的 evaluateJavascript 所實現(xiàn)玉掸。即用戶傳輸?shù)臄?shù)據(jù),需要將其轉(zhuǎn)換為字符串形式傳遞醒叁,同時把轉(zhuǎn)換后的數(shù)據(jù)內(nèi)容拼接成一份 JS 腳本司浪,再通過執(zhí)行 JS 腳本的形式傳遞到兩邊獨立環(huán)境泊业。
而 evaluateJavascript 的執(zhí)行會受很多方面的影響,數(shù)據(jù)到達(dá)視圖層并不是實時的啊易。同一進程內(nèi)的 WebView 實際上會共享一個 JS VM脱吱,如果 WebView 內(nèi) JS 線程正在執(zhí)行渲染或其他邏輯,會影響 evaluateJavascript 腳本的實際執(zhí)行時間认罩,另外多個 WebView 也會搶占 JS VM 的執(zhí)行權(quán)限箱蝠;另外還有 JS 本身的編譯執(zhí)行耗時,都是影響數(shù)據(jù)傳輸速度的因素垦垂。
其實就是setData(object)
時會調(diào)用JSON.stringify
宦搬。
循環(huán)應(yīng)用例子:
var a = {}
a.b = a
JSON.stringify
無法轉(zhuǎn)換這種結(jié)構(gòu),所以報錯劫拗。
如果非要這樣寫间校,可以改成:
var a = {}
a.b = JSON.parse(JSON.stringify(a))
參考:
Chrome sendrequest error: TypeError: Converting circular structure to JSON
微信小程序官方文檔:優(yōu)化建議