setData 时 page 可能已经被销毁,需要保护
mpvue 版本号:
mpvue@1.4.4
观察到的表现:
在小程序后台持续收到如下报警,出现问题的设备集中在微信 iOS 客户端 6.5.*
版本。
o is not a function. (In 'o(e)', 'o' is undefined);at "pages/[redacted]/main" page lifeCycleMethod onReady function
我们的调查:
通过定位,我们怀疑导致问题出现的代码片段为
var throttleSetData = throttle(function (handle, data) {
handle(data);
}, 50);
我们增加了小程序自定义分析,用于确认问题
var execCount = 0;
var errorCount = 0;
var throttleSetData = throttle(function (handle, data) {
++execCount;
if (!handle) {
++errorCount;
return wx.reportAnalytics(
'issue_investigation',
{
exec_count: execCount,
error_count: errorCount,
error_freq: Math.floor(execCount / errorCount),
},
);
}
handle(data);
}, 50);
通过统计结果,我们发现在微信 iOS 客户端 6.5.*
版本下,平均执行 800 次 throttleSetData
会出现一次 handle
为 undefined
的问题。而 handle
则是在 updateDataToMP
中通过 page.setData.bind(page)
传入的。
结论:
在微信 iOS 客户端 6.5.*
版本下,有可能出现由于 setTimeout
延迟 setData
导致 page
对象在此时已经被销毁, page.setData
为空的问题。应当在调用 handle(data)
时增加一层保护。
var throttleSetData = throttle(function (handle, data) {
if (!handle) return;
handle(data);
}, 50);
2条答案
按热度按时间tyu7yeag1#
Opened PR #1614
zxlwwiss2#
遇到了同样的问题, #1614 的 PR 应该可以解决到这个问题,还请麻烦 review 一下 RP。