微信小程序同步/异步 setStorage/setStorageSync getStorage/getStorageSync

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

这是我第一次写文章,还是一个菜鸟,不喜勿喷,要是愿意指教还是很感激的,么么踹,笔芯

转载于:https://juejin.im/post/5b3b6cd2f265da0f9155e566

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值