解決:小程序app.js 中異步調用 返回全局變量,首頁在沒有app.js沒有返回的時候開始調用自己的接口


 前段時間開發了一款微信小程序,運行了也幾個月了,在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 != '') {
//調用首頁接口
} else {
// 聲明回調函數獲取app.js onLaunch中接口調用成功后設置的globalData數據
app.testDataCallback = testData => {
if (testData != '') {
//調用首頁接口
}
}
}
}
})


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM