小程序onlaunch和onload(小程序onunload)

所述问题:前端时间开发了一个微信小程序商城项目,因为这个项目我们的需求是进入小程序就通过wx.login({})这个api进行用户登录,获取系统后台的用户基本信息。再此之前,一直以为微信小程序中的App.js中onLaunch(小程序初始化完成执行该方法)方法比其他页面的的onload方法要先执行。那么问题就来了,我每次进入小程序首页的时候有时候会先执行onlaunch方法,有时又会先执…

大家好,又见面了,我是你们的朋友全栈君。

所述问题:

前端时间开发了一个微信小程序商城项目,因为这个项目我们的需求是进入小程序就通过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 newPromise(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()

{//需要用到用户编号换取商品信息的接口

}

})

总结:

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/129608.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • mac上好用的录屏软件_mac可用的录屏软件

    mac上好用的录屏软件_mac可用的录屏软件因为工作缘故,需要经常使用录屏软件,然鹅在网上找了很久都是推荐我Quicktime,不要说众所周知的事情好吗[手动捂脸],今天给大家介绍几个我觉得挺不错的Mac录屏软件,希望你们也pick哈!放在第一说明我对他的热爱~很难找到又有简体中文,界面又好看,录屏功能又强大的软件,高举国货大旗~我感觉Quicktime的录制需要手动调节窗口实在是不友好,而这个软件就能支持多种范围的录制方式,支持1920X…

  • portraiture 3 for mac(PS人像磨皮滤镜插件)激活成功教程教程

    portraiture 3 for mac(PS人像磨皮滤镜插件)激活成功教程教程Portraiture3forMac是PS中优秀的人像磨皮滤镜插件,portraiture3mac激活成功教程版可以对皮肤、头发、眉毛、睫毛等部位进行磨皮润色处理,还能自由调整锐度、柔软度、亮度、对比度等,这里为大家带来portraiture滤镜的激活成功教程教程,赶紧来看看吧!portraiture激活成功教程步骤下载好Portraiture安装包后,点击打开Portraiture.dmg,双击【…

  • word公式编号及交叉引用技巧[通俗易懂]

    word公式编号及交叉引用技巧[通俗易懂]在给word内公式编号时,经常会遇到各种问题,本文记录我应用word时给公式编号及交叉引用的技巧。

    2022年10月23日
  • 旋转太极八卦

    旋转太极八卦太极八卦图,以同圆内的圆心为界,画出相等的两个阴阳鱼表示万物相互关系。阴鱼用黑色,阳鱼用白色,这是白天与黑夜的表示法。阳鱼的头部有个阴眼,阴鱼的头部有个阳眼,表示万物都在相互转化,互相渗透,阴中有阳,阳中有阴,阴阳相合,相生相克,即现代哲学中和矛盾对立统一规律表示法。哈哈,装了个逼。其实我就是想教大家用css3画出旋转太极八卦。仅此而已。实现效果如下图:Html的代码很简单,就一行…

  • 基于BP神经网络PID控制+Simulink仿真

    基于BP神经网络PID控制+Simulink仿真最近在学习电机的智能控制,上周学习了基于单神经元的PID控制,这周研究基于BP神经网络的PID控制。神经网络具有任意非线性表达能力,可以通过对系统性能的学习来实现具有最佳组合的PID控制。利用BP神经网络可以建立参数Kp,Ki,Kd自整定的PID控制器。基于BP神经网络的PID控制系统结构框图如下图所示:控制器由两部分组成:经典增量式PID控制器;BP神经网络…

  • mysql语句截取字符串_sql截取字符串的函数

    mysql语句截取字符串_sql截取字符串的函数今天建视图时,用到了MySQL中的字符串截取,很是方便感觉上MySQL的字符串函数截取字符,比用程序截取(如PHP或JAVA)来得强大,所以在这里做一个记录,希望对大家有用。函数:1、从左开始截取字符串left(str,length)说明:left(被截取字段,截取长度)例:selectleft(content,200)asabstractfrommy_content_t2、从右开始截…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号