前段時間開發了一款微信小程序,運行了也幾個月了,在index.js中的onLoad生命周期里獲取app.js中onLaunch生命周期中在接口里動態設置的globalData一直沒有問題,結果昨天就獲取不到動態設置的global數據了。因為我要獲取小程序的unionid以及通過unionid去獲取微信的openId,並且共享數據,最開始我是通過storage來做數據共享的,后來測試發現storage存在莫名被清空的情況,后來轉用globalData來做數據共享,查了下,是因為app.js中的onLaunch是異步的,當小程序首頁打開的時候,app.js中在onLaunch里的接口還沒有通沒有返回值,也就沒有辦法設置相應的globalData,但index.js已經執行了,當然就拿不到在app.js中動態設置的globalData的值了,我們需要的是onLaunch請求完之后,再執行index.js中的onLoad方法,解決方案如下:
在首頁index.js中先判斷一下當前app.globalData.testData是否有值,如果有則正常操作,如果沒有(第一次)則定義定義一個app方法(回調函數)app.testDataCallback = testData => {...},app.js在請求success里,判斷index.js是否定義了回調方法,如果有就執行該方法。因為回調函數是在index.js中定義的方法,所以作用域 this 指向index頁面,下面我們看下示例代碼。
//app.js App({ onLaunch: function () { wx.request({ url: 'test.ashx', //示例接口 data: { }, success: function(res) { //設置全局變量 this.globalData.testData = res.testData; //由於這里是網絡請求,可能會在 Page.onLoad 之后才返回 所以此處加入 callback 以防止這種情況 if (this.testDataCallback){ this.testDataCallback(res.testData); } } }) } })
//index.js //獲取應用實例 const app = getApp() Page({ onLoad: function () { //判斷是否獲取到動態設置的globalData if (app.globalData.testData && app.globalData.testData != '') { this.setData({ testData: true }); } else { // 聲明回調函數獲取app.js onLaunch中接口調用成功后設置的globalData數據 app.testDataCallback = testData => { if (testData != '') { this.setData({ testData: true }); } } } } })
