首页 > 热点 > 微信 > 正文

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

2024-07-22 01:18:54
字体:
来源:转载
供稿:网友

所述问题:

前端时间开发了一个微信小程序商城项目,因为这个项目我们的需求是进入小程序就通过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: '', //用户openiduserId: '', //用户编号},/*** 用户登录请求封装(解决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");}}})})}});            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表