当前位置:网站首页>小程序onlaunch和onload(小程序onunload)
小程序onlaunch和onload(小程序onunload)
2022-07-29 18:50:00 【全栈程序员站长】
大家好,又见面了,我是你们的朋友全栈君。
所述问题:
前端时间开发了一个微信小程序商城项目,因为这个项目我们的需求是进入小程序就通过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.cn/129608.html原文链接:https://javaforall.cn
边栏推荐
- 软件测试面试屡屡失败,面试官总是说逻辑思维混乱,怎么办?
- 不堆概念、换个角度聊多线程并发编程
- U盘拔出时总是提示有程序正在使用?
- Chapter 02 MySQL Data Directory [1. MySQL Architecture] [MySQL Advanced]
- 函数的声明与作用域
- Chapter 01 Installation and use of MySQL under Linux [1. MySQL Architecture] [MySQL Advanced]
- 开源数据标注工具
- FPGA设计8位十进制计数器异步/同步模块以及m序列码产生器模块
- uniapp H5 跳转应用外页面
- R语言时间序列数据提取:使用xts包的first函数提取时间序列中最前面一个月的数据(first 1 month)
猜你喜欢

centos7服务器安全策略

PX4模块设计之十四:Event设计
![[数学]必备基本知识](/img/ac/f3552ef31948e1c31ce692fa87a796.png)
[数学]必备基本知识

MarkBERT
![Chapter 02 MySQL Data Directory [1. MySQL Architecture] [MySQL Advanced]](/img/be/e9e910b29f51100f18a063c48c7db0.png)
Chapter 02 MySQL Data Directory [1. MySQL Architecture] [MySQL Advanced]

Word Embedding与Word2Vec学习

Small programs use npm packages

error TS1219: Experimental support for decorators解决

String类型_static成员_动态内存分配_拷贝构造函数_const关键字_友元函数与友元类

Low code of the trilogy
随机推荐
制作文件上传进度条
The backslash \\ in MySQL is really a pit
新博客
leetcode:36. 有效的数独
R语言时间序列数据提取:使用xts包的last函数提取时间序列中最后面10天的数据(last 10 day)
活动回顾 | 大咖云集“开源安全治理模型和工具”线上研讨会
记录一个相当坑爹的WSL局域网访问问题
pfSense高可用(HA)功能介绍
效率技巧│十分钟学会 xmind 思维导图的使用
不堆概念、换个角度聊多线程并发编程
function arguments
Realize the size of an adjustable Switch Switch
函数的参数
R语言ggplot2可视化绘制条形图(bar plot)、使用gghighlight包突出高亮条形图中的特定条形(highlight specific bar plot)
Apifox免费吗?完全免费,不限团队人数,不限功能
实现一个可调节大小的 Switch 开关
MarkBERT
支持向量机SVM
Postgresql中的pg_memory_barrier_impl和C的volatile
五种常见IO模型