当前位置:Gxlcms > JavaScript > 微信小程序onLaunch异步,首页onLoad先执行?

微信小程序onLaunch异步,首页onLoad先执行?

时间:2021-07-01 10:21:17 帮助过:16人阅读

本来按照事件顺序,小程序初始化时触发App里的onLaunch,后面再执行页面Page里的onLoad,但是在onLaunch里请求获取是否有权限,等待返回值的时候Page里的onLoad事件就已经执行了。

  1. //app.js
  2. App({
  3. onLaunch: function () {
  4. console.log('onLaunch');
  5. wx.request({
  6. url: 'test.php', //仅为示例,并非真实的接口地址
  7. data: {
  8. },
  9. success: function(res) {
  10. console.log('onLaunch-request-success');
  11. // 将employId赋值给全局变量,提供给页面做判断
  12. this.globalData.employId = res.employId;
  13. }
  14. })
  15. },
  16. globalData: {
  17. employId: ''
  18. }
  19. })
  1. //index.js
  2. //获取应用实例
  3. const app = getApp()
  4. Page({
  5. data: {
  6. albumDisabled: true,
  7. bindDisabled: false
  8. },
  9. onLoad: function () {
  10. console.log('onLoad');
  11. console.log('onLoad app.globalData.employId = ' + app.globalData.employId);
  12. //判断是用户是否绑定了
  13. if (app.globalData.employId && app.globalData.employId != '') {
  14. this.setData({
  15. albumDisabled: false,
  16. bindDisabled: true
  17. });
  18. }
  19. })

控制台打印的结果是

 onLaunch
 onLoad
 onLoad app.globalData.employId =
 onLaunch-request-success

要是能等完onLaunch请求完再执行Page的onLoad方法那该多好。

这里采用的方法是定义一个回调函数。

Page页面判断一下当前app.globalData.employId是否有值,如果没有(第一次)则定义定义一个app方法(回调函数)app.employIdCallback = employId => {...}。

App页面在请求success后判断时候有Page页面定义的回调方法,如果有就执行该方法。因为回调函数是在Page里面定义的所以方法作用域this是指向Page页面。

  1. //app.js
  2. App({
  3. onLaunch: function () {
  4. wx.request({
  5. url: 'test.php', //仅为示例,并非真实的接口地址
  6. data: {
  7. },
  8. success: function(res) {
  9. this.globalData.employId = res.employId;
  10. //由于这里是网络请求,可能会在 Page.onLoad 之后才返回
  11. // 所以此处加入 callback 以防止这种情况
  12. if (this.employIdCallback){
  13. this.employIdCallback(res.employId);
  14. }
  15. }
  16. })
  17. },
  18. globalData: {
  19. employId: ''
  20. }
  21. })
  1. //index.js
  2. //获取应用实例
  3. const app = getApp()
  4. Page({
  5. data: {
  6. albumDisabled: true,
  7. bindDisabled: false
  8. },
  9. onLoad: function () {
  10. //判断是用户是否绑定了
  11. if (app.globalData.employId && app.globalData.employId != '') {
  12. this.setData({
  13. albumDisabled: false,
  14. bindDisabled: true
  15. });
  16. } else {
  17. // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
  18. // 所以此处加入 callback 以防止这种情况
  19. app.employIdCallback = employId => {
  20. if (employId != '') {
  21. this.setData({
  22. albumDisabled: false,
  23. bindDisabled: true
  24. });
  25. }
  26. }
  27. }
  28. }
  29. })

这样的话,就能实现想要的结果。执行顺序就是:

  1. [App] onLaunch -> [Page] onLoad -> [App] onLaunch sucess callback

下面看下小程序_onLaunch异步回调数据加载问题的两种解决方案

问题

小程序开发过程中,会遇到在App启动onLaunch的时候,发起登录请求获取微信用户信息,并注册到我妈自己的服务器上以便使用,然而,这个过程中,

app on launch -> request -> success -> page onload

是无法判断success和page onload哪个先来的,会导致页面初始化数据失败的情况。

解决方案一

就是在request success中处理,使用getCurrentPages方法获取是否页面先于success生成,如果生成我们就强制让页面再次渲染。

这显然是一种hack的方式, 在实际使用过程当中,如果登录逻辑比较复杂,这个方法不是十分便利,page onload在一些特殊情况也会被调用,这显然不是我们想看到的

  1. if (getCurrentPages().length != 0) {
  2. getCurrentPages()[getCurrentPages().length - 1].onLoad()
  3. }

解决方案二

目前我在开发中使用的是这种方案,

在login的逻辑里,增加一个回调函数cbLoginCallBack。

Page页面判断一下当前app.globalData.sessionKey是否存在,如果没有(第一次)则定义定义一个app方法(回调函数)

  1. // Login Request
  2. if (app.cbLoginCallBack) {
  3. typeof app.cbLoginCallBack == 'function' && app.cbLoginCallBack(cb_login.data)
  4. }
  5. // 逻辑页面
  6. if (app.globalData.sessionkey) {
  7. // init data
  8. } else {
  9. app.cbLoginCallBack = res => {
  10. if (res) {
  11. // init data
  12. }
  13. }
  14. }

App页面在请求success后判断时候有Page页面定义的回调方法,如果有就执行该方法。因为回调函数是在Page里面定义的所以方法作用域this是指向Page页面。

总结

以上所述是小编给大家介绍的微信小程序onLaunch异步,首页onLoad先执行?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

人气教程排行