微信小程序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 相关文章推荐
syntaxhighlighter 使用方法
Jul 02 Javascript
一段效率很高的for循环语句使用方法
Aug 13 Javascript
地址栏上的一段语句,改变页面的风格。(教程)
Apr 02 Javascript
优化innerHTML操作(提高代码执行效率)
Aug 20 Javascript
javascript中全局对象的isNaN()方法使用介绍
Dec 19 Javascript
js的回调函数详解
Jan 05 Javascript
高性能JavaScript模板引擎实现原理详解
Feb 05 Javascript
元素绑定click点击事件方法
Jun 08 Javascript
常用jQuery代码分享
Jul 14 Javascript
快速掌握Node.js模块封装及使用
Mar 21 Javascript
vue+php实现的微博留言功能示例
Mar 16 Javascript
原生js实现自定义滚动条
Jan 20 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实现无限级分类 | 树型显示分类关系
2006/11/19 PHP
session在PHP大型web应用中的使用
2011/06/25 PHP
php实现插入数组但不影响原有顺序的方法
2015/03/27 PHP
微信小程序 消息推送php服务器验证实例详解
2017/03/30 PHP
PHP jQuery+Ajax结合写批量删除功能
2017/05/19 PHP
javascript 有用的脚本函数
2009/05/07 Javascript
qTip 基于JQuery的Tooltip插件[兼容性好]
2010/09/01 Javascript
在jQuery中 关于json空对象筛选替换
2013/04/15 Javascript
利用jQuary实现文字浮动提示效果示例代码
2013/12/26 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
js动态添加onclick事件可传参数与不传参数
2014/07/29 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
2015/10/28 Javascript
laravel5.3 vue 实现收藏夹功能实例详解
2018/01/21 Javascript
Vue实现点击时间获取时间段查询功能
2020/08/21 Javascript
使用vue-cli webpack 快速搭建项目的代码
2018/11/21 Javascript
js实现网页随机验证码
2020/10/19 Javascript
python应用程序在windows下不出现cmd窗口的办法
2014/05/29 Python
Python读大数据txt
2016/03/28 Python
Django 使用Ajax进行前后台交互的示例讲解
2018/05/28 Python
详解Python下ftp上传文件linux服务器
2018/06/21 Python
Flask教程之重定向与错误处理实例分析
2019/08/01 Python
python 贪心算法的实现
2020/09/18 Python
python实现快速文件格式批量转换的方法
2020/10/16 Python
pymysql模块使用简介与示例
2020/11/17 Python
Django中的DateTimeField和DateField实现
2021/02/24 Python
html5的input的required使用中遇到的问题及解决方法
2018/04/24 HTML / CSS
你的自行车健身专家:FaFit24
2016/11/16 全球购物
阿里云:Aliyun.com
2017/02/15 全球购物
联想中国官方商城:Lenovo China
2017/10/18 全球购物
J2EE包括哪些技术
2016/11/25 面试题
国际贸易专业个人职业生涯规划
2014/02/15 职场文书
质量月口号
2014/06/20 职场文书
继续教育个人总结
2015/03/03 职场文书
护士求职自荐信范文
2015/03/04 职场文书
综合素质评价个性发展自我评价
2015/03/06 职场文书
elasticSearch-api的具体操作步骤讲解
2021/06/28 Java/Android