微信小程序之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 相关文章推荐
ExtJS实现文件下载的方法实例
Nov 09 Javascript
Jquery 数组操作大全个人总结
Nov 13 Javascript
JavaScript实现维吉尼亚(Vigenere)密码算法实例
Nov 22 Javascript
详解AngularJS控制器的使用
Mar 09 Javascript
javascript实现方法调用与方法触发小结
Mar 26 Javascript
JS获取当前页面名称的简单实例
Aug 19 Javascript
Vuejs第十二篇之动态组件全面解析
Sep 09 Javascript
JS使用ActiveXObject实现用户提交表单时屏蔽敏感词功能
Jun 20 Javascript
使用JavaScript开发跨平台的桌面应用详解
Jul 27 Javascript
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
Sep 18 Javascript
js + css实现标签内容切换功能(实例讲解)
Oct 09 Javascript
小程序文字跑马灯效果
Dec 28 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与MongoDB简介|安全|M+PHP应用实例详解
2013/06/17 PHP
CI框架中libraries,helpers,hooks文件夹详细说明
2014/06/10 PHP
QQ互联一键登录审核不通过的解决方案
2014/09/10 PHP
PHP采用get获取url汉字出现乱码的解决方法
2014/11/13 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
2015/07/08 PHP
PHP字典树(Trie树)定义与实现方法示例
2017/10/09 PHP
PHP小白必须要知道的php基础知识(超实用)
2017/10/10 PHP
JavaScript 获取事件对象的注意点
2009/07/29 Javascript
JS文本框不能输入空格验证方法
2013/03/19 Javascript
你必须知道的Javascript知识点之"深入理解作用域链"的介绍
2013/04/23 Javascript
jQuery写的日历(包括日历的样式及功能)
2013/04/23 Javascript
页面定时刷新(1秒刷新一次)
2013/11/22 Javascript
js的回调函数详解
2015/01/05 Javascript
jquery实现下拉框多选方法介绍
2017/01/03 Javascript
select下拉框插件jquery.editable-select详解
2017/01/22 Javascript
javascript计算渐变颜色的实例
2017/09/22 Javascript
jqgrid实现简单的单行编辑功能
2017/09/30 Javascript
原生javascript实现连连看游戏
2019/01/03 Javascript
vue实现按钮切换图片
2021/01/20 Vue.js
vue如何使用rem适配
2021/02/06 Vue.js
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
2017/09/22 Python
Python函数any()和all()的用法及区别介绍
2018/09/14 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
2019/02/20 Python
Flask和pyecharts实现动态数据可视化
2020/02/26 Python
keras用auc做metrics以及早停实例
2020/07/02 Python
利用css3 translate完美实现表头固定效果
2017/02/28 HTML / CSS
详解淘宝H5 sign加密算法
2020/08/25 HTML / CSS
CSS实现fullpage.js全屏滚动效果的示例代码
2021/03/24 HTML / CSS
汽车电子与维修专业大学生求职信
2013/09/28 职场文书
高中军训感言600字
2014/03/11 职场文书
梅花魂教学反思
2014/04/25 职场文书
奥巴马英文演讲稿
2014/05/15 职场文书
法律专业求职信
2014/05/24 职场文书
中国梦口号
2014/06/13 职场文书
2015年医德考评自我评价
2015/03/03 职场文书
建筑工程催款函
2015/06/24 职场文书