微信小程序之onLaunch与onload异步问题详解


Posted in Javascript onMarch 28, 2019

所述问题:

前端时间开发了一个微信小程序商城项目,因为这个项目我们的需求是进入小程序就通过wx.login({}) 这个api进行用户登录,获取系统后台的用户基本信息。再此之前,一直以为微信小程序中的App.js 中onLaunch (小程序初始化完成执行该方法)方法比其他页面的的 onload 方法要先执行。那么问题就来了,我每次进入小程序首页的时候有时候会先执行onlaunch方法,有时又会先执行首页的onload的方法,最后经过确定,在微信小程序中这两个方法并没有执行先后的顺序,因为他们都是异步执行的。当然开发过微信小程序的开发者都知道微信请求数据都是异步执行的,如在同一个onload写两个请求数据的方法,它不一定会按照先后顺序去执行,这就是传说中的异步地狱了。

解决方法:

当然,我既然知道这个执行顺序是由于微信小程序的异步执行请求原因导致的。我们可以使用Promise 来解决异步编程问题啦。我的解决方法是,首先我是在app.js 中定义了一个全局方法,用来登录小程序请求用户信息的接口,每次进入首页的时候先判断我是否已有用户信息缓存,假如不存在那么请求app.js中的全局方法进行数据获取。在这里我就不详细介绍Promise 的基本用法了,因为阮一峰已经将的非常详细了,大家可以点击查看【 http://es6.ruanyifeng.com/#docs/promise#Promise-all 】。

方法实现:

App.js方法实现:

App({
onLaunch: function() {
console.log('App Launch')
//不在这里默认请求
},
/**
* 定义全局变量
*/
globalData: {
openid: '', //用户openid
userId: '', //用户编号
},
/**
* 用户登录请求封装(解决onlaunch和onload执行顺序问题)
*/
userLogin: function() {
var that = this;
//定义promise方法
return new Promise(function(resolve, reject) {
// 调用登录接口
wx.login({
success: function(res) {
if (res.code) {
console.log("用户登录授权code为:" + res.code);
//调用wx.request请求传递code凭证换取用户openid,并获取后台用户信息
wx.request({
url: 'https://www.xxxx.xxx.api', // 后台请求用户信息方法【注意,此处必须为https数字加密证书】
data: {
code: res.code //code凭证
},
header: {
'content-type': 'application/json' // 默认值
},
success(res) {
console.log(res.data)
if (res.data.errcode == 0) {
//获取用户信息成功
that.globalData.openid = res.data.openid;
that.globalData.userId = res.data.UserId;
//存入session缓存中
wx.setStorageSync("userId", that.globalData.userId)
console.log(that.globalData.userId);
console.log(that.globalData.openid);
//promise机制放回成功数据
resolve(res.data);
} else {
reject('error');
}
},
fail: function(res) {
reject(res);
wx.showToast({
title: '系统错误'
})
 },
complete: () => {

} //complete接口执行后的回调函数,无论成功失败都会调用
})
} 
else 
{
reject("error");
}
}
})
})
}
});

index.js实现:

const app=getApp();//初始化app.js
page({

onLoad: function (option) {
var that = this;
let UserId = wx.getStorageSync("userId");
console.log("进入首页的用户编号为:" + UserId);
if (UserId == '') {
app.userLogin().then(res => {
console.log("promise回调后的数据:");
console.log(res);
if (res.errcode == 0) {
//把首页需要请求的数据接口都提取到一个自定义方法中
that.GetData();
}
})
}
else
{
//用户缓存存在
that.GetData();
}

}
,
GetData()
{
//需要用到用户编号换取商品信息的接口

}
})

总结:

当然解决异步回调的方法有很多种,不过我在这里只说我认为好用的一种,大家有什么想法也可以一起分享学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用javascript父窗口控制只弹出一个子窗口
Apr 10 Javascript
JQuery限制复选框checkbox可选中个数的方法
Apr 20 Javascript
jQuery事件委托之Safari
Jul 05 Javascript
JavaScript实现刷新不重记的倒计时
Aug 10 Javascript
详解Bootstrap的iCheck插件checkbox和radio
Aug 24 Javascript
jQuery查找dom的几种方法效率详解
May 17 jQuery
浅谈KOA2 Restful方式路由初探
Mar 14 Javascript
优化Vue项目编译文件大小的方法步骤
May 27 Javascript
微信小程序之几种常见的弹框提示信息实现详解
Jul 11 Javascript
vue学习笔记之过滤器的基本使用方法实例分析
Feb 01 Javascript
jQuery实现的分页插件完整示例
May 26 jQuery
JavaScript实现雪花飘落效果
Dec 27 Javascript
详解vue使用插槽分发内容slot的用法
Mar 28 #Javascript
详解一个基于套接字实现长连接的express
Mar 28 #Javascript
微信小程序学习笔记之跳转页面、传递参数获得数据操作图文详解
Mar 28 #Javascript
微信小程序学习笔记之表单提交与PHP后台数据交互处理图文详解
Mar 28 #Javascript
深入理解es6块级作用域的使用
Mar 28 #Javascript
详解在网页上通过JS实现文本的语音朗读
Mar 28 #Javascript
详解React服务端渲染从入门到精通
Mar 28 #Javascript
You might like
php多个字符串替换成同一个的解决方法
2013/06/18 PHP
php指定函数参数默认值示例代码
2013/12/04 PHP
PHP对象相互引用的内存溢出实例分析
2014/08/28 PHP
php实现压缩合并js的方法【附demo源码下载】
2016/09/22 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
php微信开发之图片回复功能
2018/06/14 PHP
Windows Live的@live.com域名注册漏洞 利用代码
2006/12/27 Javascript
JavaScript分页功能的实现方法
2015/04/25 Javascript
javascript中eval函数用法分析
2015/04/25 Javascript
基于Jquery实现仿百度百科右侧导航代码附源码下载
2015/11/27 Javascript
JavaScript检测原始值、引用值、属性
2016/06/20 Javascript
BootStrap table表格插件自适应固定表头(超好用)
2016/08/24 Javascript
AngularJS表单验证中级篇(3)
2016/09/28 Javascript
AngularJS ng-repeat指令中使用track by子语句解决重复数据遍历错误问题
2017/01/21 Javascript
react-router实现跳转传值的方法示例
2017/05/27 Javascript
jQuery Ajax 实现分页 kkpager插件实例代码
2017/08/10 jQuery
js异步编程小技巧详解
2017/08/14 Javascript
JS将时间秒转换成天小时分钟秒的字符串
2019/07/10 Javascript
通过扫小程序码实现网站登陆功能
2019/08/22 Javascript
vue中npm包全局安装和局部安装过程
2019/09/03 Javascript
webstorm建立vue-cli脚手架的傻瓜式教程
2020/09/22 Javascript
使用FastCGI部署Python的Django应用的教程
2015/07/22 Python
python实现m3u8格式转换为mp4视频格式
2018/02/28 Python
python数据批量写入ScrolledText的优化方法
2018/10/11 Python
Python input函数使用实例解析
2019/11/22 Python
Python3 shutil(高级文件操作模块)实例用法总结
2020/02/19 Python
Python利用for循环打印星号三角形的案例
2020/04/12 Python
浅谈html5与APP混合开发遇到的问题总结
2018/03/20 HTML / CSS
全球度假村:Club Med
2017/11/27 全球购物
失业者真诚求职信范文
2013/12/25 职场文书
大学毕业生推荐信
2014/07/09 职场文书
卖房授权委托书样本
2014/10/05 职场文书
先进班组事迹材料
2014/12/25 职场文书
毕业实习指导教师评语
2014/12/31 职场文书
心理健康教育培训研修感言
2015/11/18 职场文书
Windows和Linux上部署Golang并运行程序
2022/04/22 Servers