日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

小程序數據延遲時,可使用userInfoReadyCallback解決

作者:Zan^Z 更新時間: 2022-02-21 編程語言
當小程序使用編譯模式調試某個頁面時。在onready里面獲取全局變量會有延遲的情況,(這是我遇到的問題,不知道你們會不會),使用定時器的時候可以清楚的看到多少秒后,這些數據就可以拿到
解決方法

userInfoReadyCallback 需要再onload里面使用
獲取用戶信息的網絡請求,由于其返回結果不知道在index頁面加載完成之前還是之后完成,因此分為兩種情況:
1.在index頁面加載完成之前返回:這時會優先執行app.jssuccess函數的代碼,app.globalData.userInfo.openid_mini就會有值。運行到這里時,由于userInfoReadyCallback函數是在index.onload中定義的,因此此時該函數并沒有被定義,所以不執行該函數。之后執行index.jsonload中的代碼,執行第一個if分支,賦值給頁面的userInfoisShowloginisbindOpenid

2.在index頁面加載完成之后返回,這時就會延遲:這時會優先執行index.jsonload函數的代碼,由于用戶信息還沒有返回,app.globalData.userInfo.openid_mini為undefined,執行第二個else分支,定義userInfoReadyCallback函數和isloginCallback函數返回數據,賦值給isShowloginisbindOpenid

 /**
   * 生命周期函數--監聽頁面加載
   */
  onLoad: function (options) {

    var that = this;
    if (app.globalData.userInfo.openid_mini) {  //當可以獲取到openid時
      that.setData({
        isShowlogin: app.globalData.islogin,
        isbindOpenid: app.globalData.isbindOpenid,
        userInfo: app.globalData.userInfo
      });
    } else{
      // 由于 getUserInfo 是網絡請求,可能會在 Page.onLoad 之后才返回
      // 所以此處加入 callback 以防止這種情況
      app.userInfoReadyCallback = res => {
        this.setData({
          userInfo: app.globalData.userInfo
        });
      }
      app.isloginCallback = res => {
        //console.log(res);
        this.setData({
          isShowlogin: res,
          isbindOpenid: res,
        });
      }
    }
  },

userInfoReadyCallback ,和isloginCallback 分別在app.js里面寫

//登錄從新獲取openid
  Login:function(fnback) {
    let that = this;
    let gData = this.globalData;
    wx.login({
      success: function (res) {
        if (res.code) {
          //發起網絡請求
          wx.request({
            method: "POST",
            url: gData.requesturl + 'GetOpendid',
            data: {
              gid: gData.gid,
              code: res.code
            },
            success: function (res) {
              //console.log("從新獲取openid");
              //console.log(res);
              if (res.errMsg === "request:ok") {
                gData.userInfo.openid_mini = res.data.openid;
              }
              // 由于 getUserInfo 是網絡請求,可能會在 Page.onLoad 之后才返回
              // 所以此處加入 callback 以防止這種情況
              if (that.userInfoReadyCallback) {
                that.userInfoReadyCallback(res)
              }
              if (fnback)
                fnback(res.data.openid);
            }
          })
        } else {
          console.log('登錄失敗!' + res.errMsg)
        }
      }
    })
  },

	//另一個請求方法里的
	if (that.isloginCallback)
        that.isloginCallback(true)
     }

原文鏈接:https://blog.csdn.net/Zan_Z/article/details/105515172

欄目分類
最近更新