微信小程序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 相关文章推荐
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
Feb 03 Javascript
js实现瀑布流的一种简单方法实例分享
Nov 04 Javascript
js向上无缝滚动,网站公告效果 具体代码
Nov 18 Javascript
jquery滚动加载数据的方法
Mar 09 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
Nov 24 Javascript
js实现纯前端的图片预览
Apr 27 Javascript
深入理解JS addLoadEvent函数
May 20 Javascript
判断输入的字符串是否是日期格式的简单方法
Jul 11 Javascript
利用jquery给指定的table动态添加一行、删除一行的方法
Oct 12 Javascript
用js实现before和after伪类的样式修改的示例代码
Sep 07 Javascript
js HTML5 canvas绘制图片的方法
Sep 08 Javascript
详解node.js 事件循环
Jul 22 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_xmlhttp 乱码问题解决方法
2009/08/07 PHP
php判断手机访问还是电脑访问示例分享
2014/01/20 PHP
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
2014/07/18 PHP
Zend Framework动作助手FlashMessenger用法详解
2016/03/05 PHP
php使用GD2绘制几何图形示例
2017/02/15 PHP
php压缩文件夹最新版
2018/07/18 PHP
thinkphp5 模型实例化获得数据对象的教程
2019/10/18 PHP
javascript 函数调用的对象和方法
2010/07/01 Javascript
Dom 是什么的详细说明
2010/10/25 Javascript
解决ExtJS在chrome或火狐中正常显示在ie中不显示的浏览器兼容问题
2013/01/11 Javascript
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
Jquery选择器中使用变量实现动态选择例子
2014/07/25 Javascript
javascript数据结构与算法之检索算法
2015/04/04 Javascript
nodejs实现遍历文件夹并统计文件大小
2015/05/28 NodeJs
jQuery基于cookie实现的购物车实例分析
2015/12/24 Javascript
详解从NodeJS搭建中间层再谈前后端分离
2018/11/13 NodeJs
微信小程序下拉框组件使用方法详解
2018/12/28 Javascript
微信小程序多列表渲染数据开关互不影响的实现
2020/06/05 Javascript
实例讲解Python中函数的调用与定义
2016/03/14 Python
Django权限机制实现代码详解
2018/02/05 Python
关于Numpy中的行向量和列向量详解
2019/11/30 Python
python关闭占用端口方式
2019/12/17 Python
python 实现rolling和apply函数的向下取值操作
2020/06/08 Python
python线程里哪种模块比较适合
2020/08/02 Python
详解HTML5中的picture元素响应式处理图片
2018/01/03 HTML / CSS
50道外企软件测试面试题
2014/08/18 面试题
税务干部鉴定材料
2014/02/11 职场文书
致接力运动员广播稿
2014/02/17 职场文书
运动会拉拉队口号
2014/06/09 职场文书
三月学雷锋活动总结
2014/06/26 职场文书
庆国庆活动总结
2014/08/28 职场文书
党员违纪检讨书怎么写
2014/11/01 职场文书
天气温馨提示语
2015/07/14 职场文书
​(迎国庆)作文之我爱我的祖国
2019/09/19 职场文书
手把手教你从零开始react+antd搭建项目
2021/06/03 Javascript
MySQL8.0的WITH查询详情
2021/08/30 MySQL