微信小程序同步/异步 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');
    }
复制代码

其实个人目的是这样的bash

  • onLaunch的时候,走一个接口,若是经过getStorage能够拿到缓存的话,就用这个缓存,拿不到的话就setStorage设置缓存
  • 按理说,我应该在onLaunch的时候setStorage,而后在onShow的时候拿到这个缓存而且用它,可是事实并非这样的,我好像被骗了

结果是app

  • 在onLaunch设置了缓存,没有问题,可是在某一步的时候应该是阻塞了,而后onLaunch尚未设置进缓存的时候,onShow就开始去缓存,致使拿不到,因此又在onShow的时候从新设置了缓存

个人解决方法异步

  • 用了setStorageSync,getStorageSync,可是个人同事说我是个傻叉,怪不得没有女友,哼

他的解决办法ui

  • 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,可是貌似没什么用

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

相关文章
相关标签/搜索