小程序解决onLaunch异步执行完后再执行各页面的onLoad方法

348 阅读1分钟

首先我们先了解一下小程序的加载顺序:

  • 首先执行 App.onLaunch -> App.onShow
  • 其次执行 Component.created -> Component.attached
  • 再执行 Page.onLoad -> Page.onShow
  • 最后 执行 Component.ready -> Page.onReady

我们经常会遇到一种业务就是需要拿到客户的登陆token,才能执行后面其他的接口。那就会出现一种情况就是在onLaunch发起异步请求token,onLoad执行的异步接口因为没有及时拿到token,导致接口请求失败....

解决方案:

// app.js
App({
  onLaunch: function (options) {
    // 请求token接口
    wx.request({
      url: '/Mall/WxLogin', //仅为示例,并非真实的接口地址
      header: {
        'content-type': 'application/x-www-form-urlencoded',
        'accept': 'application/json',
      },
      success(res) {
        console.log('执页面回调方法========');
        wx.setStorageSync('token', res.data.token);
        this.globalData.wxLoginFlag = true; // 记录接口已经请求完
        if (this.pageCallback) {
          this.pageCallback(options.query);
        }
      }
    });
  })
}),

// 全局变量
globalData: {
   wxLoginFlag: false, // wxlogin 接口是否请求
}
// test.js

const APP = getApp();
Page({

  onLoad: function (options) {
    if (!APP.globalData.wxLoginFlag) {
      console.log('进入者wxlogin请求=========')
      APP.pageCallback = (options) => {
        this.pageCallback(options);
      }
    } else {
      console.log('进入普通正常请求=========')
      this.pageCallback(options);
    }
  },
  
  // 页面回调方法
  pageCallback(options) {
    console.log("打印页面参数::", options);
   // 编写页面的请求逻辑
   // ....

  },

})

~~ END ~~