微信小程序之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 相关文章推荐
IE8 原生JSON支持
Apr 13 Javascript
JavaScript DOM 学习第七章 表单的扩展
Feb 19 Javascript
js对字符的验证方法汇总
Feb 04 Javascript
jQuery选择器用法实例详解
Dec 17 Javascript
漂亮! js实现颜色渐变效果
Aug 12 Javascript
AngularJS 控制器 controller的详解
Oct 17 Javascript
详解vue渲染函数render的使用
Dec 12 Javascript
Vue 过滤器filters及基本用法
Dec 26 Javascript
vue实现多条件和模糊搜索功能
May 28 Javascript
Element-UI中关于table表格的那些骚操作(小结)
Aug 15 Javascript
解决使用layui对select append元素无效或者未及时更新的问题
Sep 18 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
Nov 07 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的fsockopen、pfsockopen函数被主机商禁用的解决办法
2014/07/08 PHP
基于thinkPHP框架实现留言板的方法
2016/10/17 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
php输出形式实例整理
2020/05/05 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2006/11/24 Javascript
jquery ui dialog里调用datepicker的问题
2009/08/06 Javascript
前端开发部分总结[兼容性、DOM操作、跨域等](持续更新)
2010/03/04 Javascript
php对mongodb的扩展(初识如故)
2012/11/11 Javascript
深入学习 JavaScript中的函数调用
2017/03/23 Javascript
使用 jQuery 实现表单验证功能
2017/07/05 jQuery
JS实现遍历不规则多维数组的方法
2018/03/21 Javascript
Vue-cli配置打包文件本地使用的教程图解
2018/08/02 Javascript
JavaScript设计模式之门面模式原理与实现方法分析
2020/03/09 Javascript
python实现的防DDoS脚本
2011/02/08 Python
用Python的Flask框架结合MySQL写一个内存监控程序
2015/11/07 Python
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
pandas通过字典生成dataframe的方法步骤
2019/07/23 Python
使用python+whoosh实现全文检索
2019/12/09 Python
python分布式爬虫中消息队列知识点详解
2020/11/26 Python
HTML5本地存储之Database Storage应用介绍
2013/01/06 HTML / CSS
HTML5 通信API 跨域门槛将不再高、数据推送也不再是梦
2013/04/25 HTML / CSS
AmazeUI 点击元素显示全屏的实现
2020/08/25 HTML / CSS
HTML5单选框、复选框、下拉菜单、文本域的实现代码
2020/12/01 HTML / CSS
日本化妆品植村秀俄罗斯官方网站:Shu Uemura俄罗斯
2020/02/01 全球购物
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
捷克购买家具网站:JENA nábytek
2020/03/19 全球购物
运动会100米解说词
2014/01/23 职场文书
新三好学生主要事迹
2014/01/23 职场文书
中学生励志演讲稿
2014/04/26 职场文书
中等生评语大全
2014/05/04 职场文书
经济类毕业生求职信
2014/06/26 职场文书
热爱劳动主题班会
2015/08/14 职场文书
CSS完成视差滚动效果
2021/04/27 HTML / CSS
Python 快速验证代理IP是否有效的方法实现
2021/07/15 Python
电脑无法安装Windows 11怎么办?无法安装Win11的解决方法
2021/11/21 数码科技
Spring Boot项目传参校验的最佳实践指南
2022/04/05 Java/Android