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


Posted in Javascript onSeptember 20, 2018

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

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

控制台打印的结果是

 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页面。

//app.js
 App({
  onLaunch: function () {
   wx.request({
    url: 'test.php', //仅为示例,并非真实的接口地址
    data: {
    },
    success: function(res) {
    this.globalData.employId = res.employId;
     //由于这里是网络请求,可能会在 Page.onLoad 之后才返回
     // 所以此处加入 callback 以防止这种情况
     if (this.employIdCallback){
      this.employIdCallback(res.employId);
     }
    }
   })
  },
  globalData: {
   employId: ''
  }
 })
//index.js
//获取应用实例
const app = getApp()
Page({
 data: {
  albumDisabled: true,
  bindDisabled: false
 },
 onLoad: function () {
  //判断是用户是否绑定了
  if (app.globalData.employId && app.globalData.employId != '') {
   this.setData({
    albumDisabled: false,
    bindDisabled: true
   });
  } else {
   // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
   // 所以此处加入 callback 以防止这种情况
   app.employIdCallback = employId => {
    if (employId != '') {
     this.setData({
      albumDisabled: false,
      bindDisabled: true
     });
    }
   }
  }
 }
})

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

[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在一些特殊情况也会被调用,这显然不是我们想看到的

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

解决方案二

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

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

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

// Login Request
if (app.cbLoginCallBack) {
   typeof app.cbLoginCallBack == 'function' && app.cbLoginCallBack(cb_login.data)
  }
// 逻辑页面
if (app.globalData.sessionkey) {
  // init data
} else {
  app.cbLoginCallBack = res => {
    if (res) {
      // init data
    }
  }
}

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

总结

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

Javascript 相关文章推荐
javscript对象原型的一些看法
Sep 19 Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
Apr 04 Javascript
javascript返回顶部的按钮实现方法
Jan 09 Javascript
jQuery事件绑定on()与弹窗实现代码
Apr 28 Javascript
JS中innerHTML和pasteHTML的区别实例分析
Jun 22 Javascript
用jquery获取自定义的标签属性的值简单实例
Sep 17 Javascript
浅谈Javascript中的Label语句
Dec 14 Javascript
angularjs实现的购物金额计算工具示例
May 08 Javascript
javascript定时器的简单应用示例【控制方块移动】
Jun 17 Javascript
解决Vue调用springboot接口403跨域问题
Sep 02 Javascript
js获取浏览器地址(获取第1个斜杠后的内容)
Sep 03 Javascript
js在HTML的三种引用方式详解
Aug 29 Javascript
vue3.0 CLI - 3.2 路由的初级使用教程
Sep 20 #Javascript
微信小程序使用gitee进行版本管理
Sep 20 #Javascript
jQuery easyui datagird编辑行删除行功能的实现代码
Sep 20 #jQuery
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
Sep 20 #Javascript
jQuery 点击获取验证码按钮及倒计时功能
Sep 20 #jQuery
Vuex 快速入门(简单易懂)
Sep 20 #Javascript
vue项目打包部署_nginx代理访问方法详解
Sep 20 #Javascript
You might like
php下MYSQL limit的优化
2008/01/10 PHP
网页游戏开发入门教程三(简单程序应用)
2009/11/02 PHP
动态加载js和css(外部文件)
2013/04/17 Javascript
js 走马灯简单实例
2013/11/21 Javascript
Array栈方法和队列方法的特点说明
2014/01/24 Javascript
iframe跨域通信封装详解
2015/08/11 Javascript
JavaScript获取当前url根目录(路径)
2016/06/17 Javascript
JSONP跨域请求实例详解
2016/07/04 Javascript
JavaScript数据操作_浅谈原始值和引用值的操作本质
2016/08/23 Javascript
js前端解决跨域问题的8种方案(最新最全)
2016/11/18 Javascript
Bootstrap基本样式学习笔记之图片(6)
2016/12/07 Javascript
JS数组搜索之折半搜索实现方法分析
2017/03/27 Javascript
微信小程序动态显示项目倒计时效果
2017/06/13 Javascript
Vue中定义全局变量与常量的各种方式详解
2017/08/23 Javascript
JavaScript变速动画函数封装添加任意多个属性
2019/04/03 Javascript
微信小程序 下拉刷新及上拉加载原理解析
2019/11/06 Javascript
在Vue项目中使用Typescript的实现
2019/12/19 Javascript
Vue路由的模块自动化与统一加载实现
2020/06/05 Javascript
Openlayers实现地图全屏显示
2020/09/28 Javascript
[53:10]Secret vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[42:52]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python教程之用py2exe将PY文件转成EXE文件
2014/06/12 Python
python中的hashlib和base64加密模块使用实例
2014/09/02 Python
Python基于pillow判断图片完整性的方法
2016/09/18 Python
利用python如何处理nc数据详解
2018/05/23 Python
numpy中矩阵合并的实例
2018/06/15 Python
Python操作json的方法实例分析
2018/12/06 Python
Python使用import导入本地脚本及导入模块的技巧总结
2019/08/07 Python
Python3.7 pyodbc完美配置访问access数据库
2019/10/03 Python
南非领先的在线旅行社:Travelstart南非
2016/09/04 全球购物
澳大利亚领先的宠物用品商店:VetSupply
2017/09/08 全球购物
Champion澳大利亚官网:美国冠军运动服装
2018/05/07 全球购物
墨尔本复古时尚品牌:Dangerfield
2018/12/12 全球购物
超市业务员岗位职责
2013/12/05 职场文书
自愿离婚协议书范本
2014/09/13 职场文书
中职毕业生自我鉴定
2014/09/13 职场文书