小程序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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 你不知道的几个牛逼网站,欢迎收藏

    你不知道的几个牛逼网站,欢迎收藏自己收藏的几个好玩牛逼的网站1、搜源码-方便找到你想要的一些源码,例如一些插件的js,免得去一些博客花钱去下载了链接:http://www.bvbcode.com/cn/.2、在线P图,不用下载或者等待photoshop打开,很爽的一个网站链接:https://www.uupoop.com/ps/.3、最全的jquery源码插件大全链接:http://www.jq22.com.4、在线的postwoman,测试接口方便至极链接:https://postwoman.io/.5、几个可

    2022年7月20日
    23
  • 手机chrome禁止加载图片_com组件未加载或被禁止

    手机chrome禁止加载图片_com组件未加载或被禁止splash禁止图片加载

    2025年8月13日
    4
  • c语言实现图书管理系统创新_c语言图书管理系统源代码

    c语言实现图书管理系统创新_c语言图书管理系统源代码/* 课程设计项目名称:图书查询系统 作者:施瑞文 时间:2018.3.4*/#include<stdio.h>#include<string.h>#include<windows.h>#include<conio.h>#include<stdlib.h>#defineNsizeof(structBOOK)…

    2022年10月11日
    3
  • vscode写前端代码要装什么插件_AE必备插件

    vscode写前端代码要装什么插件_AE必备插件本篇文章先介绍下常见的插件,如果本文对你有所帮助请三连支持博主,你的支持是我更新的动力。vscode之所以被称为宇宙第一神器(虽然我喜欢用HBuilderX),其中丰富的插件功不可没,安装起来超级简单,给我们开发带来了极大的便捷。注意,新手学习期间,不建议安装t太多的插件,用到啥就安装啥。因为有些插件会到vue学习的时候引起冲突,所以这里就介绍几个常用的插件。vscode刚下载完毕是语言英文的,要先安装这个插件,把语言改为中文版,所以是我们第一个安装的插件就是他想必各位大佬也都用。修改开始标签,结束标签

    2022年9月30日
    3
  • pycharm如何安装numpy库_四上入库

    pycharm如何安装numpy库_四上入库NumPy(NumericalPython)是Python语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。NumPy是一个运行速度非常快的数学库,主要用于数组计算。(一)打开PyCharm,点击设置(二)选择左侧栏目中的“项目:pythonProject”–“Python解释器”,点击右侧“+”(三)输入“numpy”,安装即可…

    2022年8月27日
    5
  • ENVI5.3.1使用Landsat 8影像进行辐射定标和大气校正实例操作

    ENVI5.3.1使用Landsat 8影像进行辐射定标和大气校正实例操作ENVI5.3.1使用Landsat8影像进行辐射定标和大气校正实例操作

    2022年7月23日
    10

发表回复

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

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