微信小程序之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工具函数代码
Feb 17 Javascript
详细分析JavaScript变量类型
Jul 08 Javascript
jQuery实现动态表单验证时文本框抖动效果完整实例
Aug 21 Javascript
js实现下拉列表选中某个值的方法(3种方法)
Dec 17 Javascript
jQuery使用getJSON方法获取json数据完整示例
Sep 13 Javascript
JS实现图片垂直居中显示小结
Dec 13 Javascript
AngularJS双向绑定和依赖反转实例详解
Apr 15 Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
Jun 04 Javascript
基于jQuery解决ios10以上版本缩放问题
Nov 03 jQuery
javascript使用正则实现去掉字符串前面的所有0
Jul 23 Javascript
Node.js console控制台简单用法分析
Jan 04 Javascript
bootstrap Table实现合并相同行
Jul 19 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返回相对时间(如:20分钟前,3天前)的方法
2015/04/14 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
javascript实现的弹出层背景置灰-模拟(easyui dialog)
2013/12/27 Javascript
在页面加载完成后通过jquery给多个span赋值
2014/05/21 Javascript
什么是MEAN?JavaScript编程中的MEAN是什么意思?
2014/12/18 Javascript
浅谈javascript的Touch事件
2015/09/27 Javascript
Node.js 文件夹目录结构创建实例代码
2016/07/08 Javascript
浅析Angular2子模块以及异步加载
2017/04/24 Javascript
angularjs中使用ng-bind-html和ng-include的实例
2017/04/28 Javascript
一个简易的js图片轮播效果
2017/07/22 Javascript
基于Vue.js实现tab滑块效果
2017/07/23 Javascript
详解使用路由延迟加载 Angular 模块
2017/10/12 Javascript
总结js中的一些兼容性易错的问题
2017/12/18 Javascript
如何检查一个对象是否为空
2019/04/11 Javascript
函数式编程入门实践(一)
2019/04/20 Javascript
vue动态注册组件实例代码详解
2019/05/30 Javascript
layUI实现列表查询功能
2019/07/27 Javascript
uniapp实现可滑动选项卡
2020/10/21 Javascript
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
Python实现时钟显示效果思路详解
2018/04/11 Python
python障碍式期权定价公式
2019/07/19 Python
Pandas0.25来了千万别错过这10大好用的新功能
2019/08/07 Python
利用python实现汉字转拼音的2种方法
2019/08/12 Python
Python的垃圾回收机制详解
2019/08/28 Python
Python 一行代码能实现丧心病狂的功能
2020/01/18 Python
Python类中的装饰器在当前类中的声明与调用详解
2020/04/15 Python
使用Python下载抖音各大V视频的思路详解
2021/02/06 Python
CSS3 中filter(滤镜)属性使用详解
2020/04/07 HTML / CSS
写好自荐信的几个要点
2013/12/26 职场文书
简历里的自我评价
2014/01/31 职场文书
质量承诺书范文
2014/03/27 职场文书
无传销社区工作方案
2014/05/13 职场文书
医院竞聘演讲稿
2014/05/16 职场文书
党员个人年度总结
2015/02/14 职场文书
2016年基层党组织创先争优承诺书
2016/03/25 职场文书
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android