mpvue setData 时 page 可能已经被销毁

nwlls2ji  于 8个月前  发布在  其他
关注(0)|答案(2)|浏览(252)

setData 时 page 可能已经被销毁,需要保护

mpvue 版本号:

mpvue@1.4.4

观察到的表现:

在小程序后台持续收到如下报警,出现问题的设备集中在微信 iOS 客户端 6.5.* 版本。

  1. o is not a function. (In 'o(e)', 'o' is undefined);at "pages/[redacted]/main" page lifeCycleMethod onReady function

我们的调查:

通过定位,我们怀疑导致问题出现的代码片段为

  1. var throttleSetData = throttle(function (handle, data) {
  2. handle(data);
  3. }, 50);

我们增加了小程序自定义分析,用于确认问题

  1. var execCount = 0;
  2. var errorCount = 0;
  3. var throttleSetData = throttle(function (handle, data) {
  4. ++execCount;
  5. if (!handle) {
  6. ++errorCount;
  7. return wx.reportAnalytics(
  8. 'issue_investigation',
  9. {
  10. exec_count: execCount,
  11. error_count: errorCount,
  12. error_freq: Math.floor(execCount / errorCount),
  13. },
  14. );
  15. }
  16. handle(data);
  17. }, 50);

通过统计结果,我们发现在微信 iOS 客户端 6.5.* 版本下,平均执行 800 次 throttleSetData 会出现一次 handleundefined 的问题。而 handle 则是在 updateDataToMP 中通过 page.setData.bind(page) 传入的。

结论:

在微信 iOS 客户端 6.5.* 版本下,有可能出现由于 setTimeout 延迟 setData 导致 page 对象在此时已经被销毁, page.setData 为空的问题。应当在调用 handle(data) 时增加一层保护。

  1. var throttleSetData = throttle(function (handle, data) {
  2. if (!handle) return;
  3. handle(data);
  4. }, 50);
tyu7yeag

tyu7yeag1#

Opened PR #1614

zxlwwiss

zxlwwiss2#

遇到了同样的问题, #1614 的 PR 应该可以解决到这个问题,还请麻烦 review 一下 RP。

相关问题