最近在写一个小程序的监控文件,遇到一个很常见的错,就是setStorage和getStorage是异步的问题
其中有两段代码是这样写的
native.onLaunch = function (options) {
console.log("hook onLaunch", options);
onLaunch && onLaunch.apply(native, [options]);
getUID(function (uid) {
report("launch", options, uid, native.globalData.appid, native.globalData.mwbase || "https://v2m-test.mengxiaozhu.cn/ad-applet")
}, 'launch')
复制代码
native.onShow = function (options) {
console.log("hook onShow", options);
onShow && onShow.apply(native, [options]);
getUID(function (uid) {
report("show", options, uid, native.globalData.appid, native.globalData.mwbase || "https://v2m-test.mengxiaozhu.cn/ad-applet")
}, 'show');
}
复制代码
其实我的目的是这样的
- onLaunch的时候,走一个接口,如果通过getStorage可以拿到缓存的话,就用这个缓存,拿不到的话就setStorage设置缓存
- 按理说,我应该在onLaunch的时候setStorage,然后在onShow的时候拿到这个缓存并且用它,但是事实并不是这样的,我好像被骗了
结果是
- 在onLaunch设置了缓存,没有问题,但是在某一步的时候应该是阻塞了,然后onLaunch还没有设置进缓存的时候,onShow就开始去缓存,导致拿不到,所以又在onShow的时候重新设置了缓存
我的解决方法
- 用了setStorageSync,getStorageSync,但是我的同事说我是个傻叉,怪不得没有女朋友,哼
他的解决办法
- setStorage没有改变,还是用
const setUid = function(cb) {
wx.setStorage({
key: 'KeyMw',
data: value,
success: function(res) {
cb(value)
console.log('SuccessSet', res)
},
fail: function(err) {
console.log('FailSet', err)
}
})
}
复制代码
- getStorage
const stacks = [];
const getUID = funcction(cb) {
if(stacks.length >=0) {
stacks.push(cb)
}
wx.getStorage({
key: 'KeyMw',
success: function(res) {
if(res.data) {
const _cb = stacks.pop();
if(!_cb) {
return
}
_cb(res.data)
return
}
setUID(value => {
const _cb = stacks.pop();
if(!_cb) {
return
}
_cb(value)
})
},
fail: function() {
setUID(value => {
const _cb = stacks.pop();
if(!_cb) {
return
}
_cb(value)
})
}
})
}
复制代码
- 当然,这是没有简化过得
- 我也用了Promise,但是貌似没什么用