小程序線程
小程序中包含兩個線程
- view 線程負(fù)責(zé)解析渲染頁面(wxml和wxss)
- appServer 線程負(fù)責(zé)運行 JavaScript。貫穿了整個小程序的主題邏輯、生命周期以及頁面構(gòu)成、樣式等。小程序?qū)嵗龑⒂蒩ppServer線程運行。
測試:
//事件處理函數(shù)
bindViewTap: function() {
setTimeout(function() {
console.log('我是首頁')
}, 3000);
// wx.navigateTo({
// url: '../logs/logs'
// })
// wx.redirectTo({
// url: '../logs/logs'
// })
wx.reLaunch({
url: '../logs/logs'
})
}
onShow: function () {
console.log('我是log頁面');
}
結(jié)果:

問題描述
發(fā)現(xiàn)告警中有很多類似這樣的報錯,但是也沒有影響主流程
錯誤樣例: Cannot read property 'length' of undefined;at vipshop/act/pages/harmony/default/pages/index/main handleProxy function;at setTimeout callback function
注:只是類似這種問題
定位問題
首先這個是在 setTimeout 中出現(xiàn)的問題,所以我們可以從這里出發(fā)搜索。
發(fā)現(xiàn)在小程序中有使用 setTimeout 但是在頁面 onHide() 或者 onUnload() 的時候沒有執(zhí)行 clearTimeout()。
當(dāng)我們從當(dāng)前的頁面切換到其他頁面的時候(當(dāng)跳轉(zhuǎn)了很多個頁面之后,手機會默認(rèn)回收一些頁面),如下圖所示

如果setTimeout 的callback 中有某些對象,或者函數(shù)操作,如果沒有清除,后臺線程將會繼續(xù)執(zhí)行,導(dǎo)致告警。
后果:
- setTimeout的回調(diào)函數(shù)中有跳轉(zhuǎn)邏輯,會產(chǎn)生“莫名跳轉(zhuǎn)”問題
- 報錯告警
- 嚴(yán)重影響性能
重新問題
目前沒有辦法重現(xiàn)該問題
解決方法
在頁面 onHide() 或者 onUnload() 的時候執(zhí)行 clearTimeout()

參考
小程序定制js 線程不隨頁面銷毀比如 setTimeout 和 setInterval