如何解决小程序onload,onlaunch先后的问题

初次开发小程序,一开始以为是onlaunch执行完了再onload,实际并不是,然后就导致需要的条件判断一直是false,先上大概的代码段:

app.js

onLaunch: function () {
    //登录
    this.userLogin()
},
userLogin: function () {
    // 登录
    wx.login({
      success: res => {
        // 发送 res.code 到后台换取 openId, sessionKey, unionId        
        if (res.code){
          wx.request({
            url: "login.php", 
            data: {
              code : res.code
            },
            method : "POST",
            header : {
              "content-type": "application/x-www-form-urlencoded"
            },
            success: function (res) {
              getApp().globalData.hasAuthorize = true;
            },
            fail: function () {
              console.log('服务器请求失败!')
            },
          })
        } else {
          console.log('获取用户信息失败!' + res.errMsg)
        }
      }
    })
  },
 globalData: {
    userInfo: null,
    hasAuthorize: false
  }

index.js

onLoad: function () {
    //在页面展示之后先获取一次数据
    this.setData({
      hasAuthorize: app.globalData.hasAuthorize
    })
  },

我的问题:

很多时候打开小程序时,还没onLaunch完,index.js的onLoad已经执行了,导致hasAuthorize每次拿到的都是app.globalData.hasAuthorize的初始值(false)

有什么办法能等onLaunch完在onLoad吗?新手求指教,谢谢。

阅读 4.6k
1 个回答

你所遇到的问题并不是onLoadonLaunch之前执行,而是在onLaunch中的异步操作回调触发晚于onLoad(这是必然的)。

所以有一个很简单的解决方案:
不要直接在onLoad中获取app.globalData.hasAuthorize,而是暴露一个函数,传入回调,在回调中设置hasAuthorize

类似这样的代码:

{
  // ...
  onLoad () {
    this.getAuthorize().then(res => {
      this.setData({
        hasAuthorize: res
      })
    })
  }
  getAuthorize () {
    const { globalData } = getApp()
    return new Promise((resolve, reject) => {
      if (globalData.loaded) {
        resolve(globalData. hasAuthorize)
      } else {
        // 在此处执行 userLogin 的逻辑,并在 success 中多添加一行resolve
        
        {
          success () {
            globalData.hasAuthorize = true
            
            // 顺便触发 resolve + 修改 flag
            
            globalData.loaded = true
            resolve(true)
          }
          
          fail () {
            reject()
          }
        }
      }
    })
  }
  // ...
}
伪代码示例,仅作思路参考,这样就可以让onLaunch的逻辑删掉了,而且也不需要担心会重复的发送请求。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题