小程序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()

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

}

})

总结:

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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • nginx设置ip访问就跳转域名_php页面跳转方法

    nginx设置ip访问就跳转域名_php页面跳转方法目的:将所有wangqiao123.comabc.wangqiao123.com域名自动跳转到www.wangqiao123.comserver{listen80;server_namewangqiao123.comabc.wangqiao123.com;…

    2022年10月4日
    1
  • CAN协议深度解析-简单易懂协议详解[通俗易懂]

    CAN协议深度解析-简单易懂协议详解[通俗易懂]CAN-bus通信帧共分为数据帧、远程帧、错误帧、过载帧和帧间隔五种类型。显形隐形电平CAN-bus发布了ISO11898和ISO11519两个通信标准,此两个标准中差分电平的特性不相同。显性电平:总线上只要有1个节点驱动为显性,则总线表现为显性位电平,逻辑解析为“0”。隐形电平:只有总线上的各节点都不将总线驱动成显性电平,总线才表现为隐形位对应的电平,逻辑解析为“1”。位填充:位填充是为防止突发错误而设定的功能。当同样的电平持续5位时,则添加一个位的反型数据。数据帧数据帧结构上

    2022年6月28日
    51
  • PHP 获取客户端ip地址

    PHP 获取客户端ip地址

    2021年11月5日
    45
  • js中settimeout和setInterval区别_JavaScript set

    js中settimeout和setInterval区别_JavaScript setsetTimeout描述setTimeout(code,millisec)setTimeout()方法用于在指定的毫秒数后调用函数或计算表达式。注:调用过程中,可以使用clearTimeout(id_of_settimeout)终止参数描述code必需,要调用的函数后要执行的JavaScript代码串。millisec必需,在执行代码前需等待的毫秒数。setTimeintervalsetIn…

    2022年10月4日
    4
  • Spring Boot MyBatis注解:@MapperScan和@Mapper

    Spring Boot MyBatis注解:@MapperScan和@Mapper需求缘起:在之前的文章中,我们定义DemoMapper类,但是并没有在该类上定义类似@Service或者@Controller之类的注解,那么为什么可以被Spring管理呢?(1)方式一:使用@Mapper注解为了让DemoMapper能够让别的类进行引用,我们可以在DemMapper类上添加@Mapper注解:Java代码@Mapper…

    2022年6月12日
    39
  • 堆和栈的区别

    堆和栈的区别转:https://my.oschina.net/aofe/blog/267882堆和栈的区别:·1>堆空间的内存是动态分配的,一般存放对象,并且需要手动释放内存。需要程序员自

    2022年7月2日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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