最近在写一个小程序的监控文件,遇到一个很常见的错,就是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,但是貌似没什么用