微信小程序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 相关文章推荐
JS下拉缓冲菜单示例代码
Aug 30 Javascript
asp.net刷新本页面的六种方法总结
Jan 07 Javascript
javascript实现自动填写表单实例简析
Dec 02 Javascript
jquery实现页面常用的返回顶部效果
Mar 04 Javascript
jQuery数组处理函数整理
Aug 03 Javascript
Javascript将字符串日期格式化为yyyy-mm-dd的方法
Oct 27 Javascript
Javascript 制作图形验证码实例详解
Dec 22 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
Jan 05 Javascript
Vue中Quill富文本编辑器的使用教程
Sep 21 Javascript
JS div匀速移动动画与变速移动动画代码实例
Mar 26 Javascript
Node.js中console.log()输出彩色字体的方法示例
Dec 01 Javascript
js实现点击按钮随机生成背景颜色
Sep 05 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
header导出Excel应用示例
2014/01/24 PHP
php身份证号码检查类实例
2015/06/18 PHP
yii2.0使用Plupload实现带缩放功能的多图上传
2015/12/22 PHP
浅析Yii2缓存的使用
2016/05/10 PHP
总结AJAX相关JS代码片段和浏览器模型
2007/08/15 Javascript
js实现翻页后保持checkbox选中状态的实现方法
2012/11/03 Javascript
JQuery 图片的展开和伸缩实例讲解
2013/04/18 Javascript
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
判断js对象是否拥有某一个属性的js代码
2013/08/16 Javascript
嵌入式iframe子页面与父页面js通信的方法
2015/01/20 Javascript
实现JavaScript的组成----BOM和DOM详解
2016/05/18 Javascript
javascript 数组的正态分布排序的问题
2016/07/31 Javascript
利用vue.js插入dom节点的方法
2017/03/15 Javascript
BackBone及其实例探究_动力节点Java学院整理
2017/07/14 Javascript
详解nodejs通过代理(proxy)发送http请求(request)
2017/09/22 NodeJs
解决option标签selected="selected"属性失效的问题
2017/11/06 Javascript
vue中使用refs定位dom出现undefined的解决方法
2017/12/21 Javascript
Element-UI Table组件上添加列拖拽效果实现方法
2018/04/14 Javascript
JavaScript中.min.js和.js文件的区别讲解
2019/02/13 Javascript
[01:18:31]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第一场 1月10日
2021/03/11 DOTA
Python定时发送天气预报邮件代码实例
2019/09/09 Python
Python中的四种交换数值的方法解析
2019/11/18 Python
使用python实现回文数的四种方法小结
2019/11/24 Python
Python2与Python3的区别详解
2020/02/09 Python
Pycharm最常用的快捷键及使用技巧
2020/03/05 Python
python手机号前7位归属地爬虫代码实例
2020/03/31 Python
使用pytorch 筛选出一定范围的值
2020/06/28 Python
如何通过python计算圆周率PI
2020/11/11 Python
CSS3绘制超炫的上下起伏波动进度加载动画
2016/04/21 HTML / CSS
哈萨克斯坦最大的时装、鞋子和配饰在线商店:Lamoda.kz
2019/11/19 全球购物
什么是事务?为什么需要事务?
2012/01/09 面试题
服务中心夜班服务员岗位职责
2013/11/27 职场文书
党支部书记岗位责任制
2014/02/11 职场文书
机关干部作风建设剖析材料
2014/10/23 职场文书
2016初一新生军训心得体会
2016/01/11 职场文书
HTML基本元素标签介绍
2022/02/28 HTML / CSS