小程序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)
上一篇 2022年4月14日 上午6:40
下一篇 2022年4月14日 上午6:40


相关推荐

  • DOMContentLoaded和window.onload

    DOMContentLoaded和window.onload

    2022年1月15日
    57
  • web.xml的加载过程配置详解

    web.xml的加载过程配置详解一:web.xml加载过程  简单说一下,web.xml的加载过程。当我们启动一个WEB项目容器时,容器包括(JBoss,Tomcat等)。首先会去读取web.xml配置文件里的配置,当这一步骤没有出错并且完成之后,项目才能正常的被启动起来。  启动WEB项目的时候,容器首先会去读取web.xml配置文件中的两个节点:和如图:    紧接着,容器创建一个Serv

    2022年7月26日
    15
  • HashMap currentHashMap总结

    HashMap currentHashMap总结HashMap不同点:(1)JDK1.7用的是头插法,而JDK1.8及之后使用的都是尾插法,那么他们为什么要这样做呢?因为JDK1.7是用单链表进行的纵向延伸,当采用头插法时会容易出现逆序且环形链表死循环问题。但是在JDK1.8之后是因为加入了红黑树使用尾插法,能够避免出现逆序且链表死循环的问题。(2)扩容后数据存储位置的计算方式也不一样:1.在JDK1.7的时候是直接用hash值和需要扩…

    2022年6月18日
    25
  • 物联网架构图_物联网的架构

    物联网架构图_物联网的架构

    2026年1月19日
    6
  • 批处理命令for循环_批处理获取某个目录大小

    批处理命令for循环_批处理获取某个目录大小使用批处理批量读取目录中的文件名,并根据文件名,使用for循环对文件逐一进行处理。

    2022年8月31日
    8
  • Java ArrayList扩容机制

    Java ArrayList扩容机制设 ArrayList 的容量为 Capacity 如果你 ArrayListarr newArrayList initial capacity 那么 ArrayList 的初始容量就是 initial capacity 否则就为 10 添加元素时 1 如果元素个数 1 lt Capacity 那就放心添加元素 2 元素个数 1 gt Capacity 那 ArrayList 就发生扩容 容量 Capacity 变为 1 5Capacity 其实是 Capacity Capacity Capacity amp g

    2026年3月18日
    2

发表回复

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

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