微信小程序同步/異步 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,可是貌似沒什麼用

這是我第一次寫文章,仍是一個菜鳥,不喜勿噴,要是願意指教仍是很感激的,麼麼踹,筆芯

相關文章
相關標籤/搜索