微信小程序首頁index.js獲取不到app.js中動態設置的globalData的原因以及解決方法


  前段時間開發了一款微信小程序,運行了也幾個月了,在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
          });
        }
      }
    }
  }
})
 

 


免責聲明!

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



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