setTimeout 在小程序中的問題

小程序線程

小程序中包含兩個線程

  • 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

http://html51.com/info-43461-1/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容