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


相关推荐

  • python 报错: unindent does not match any outer indentation level

    python 报错: unindent does not match any outer indentation level

    2021年11月11日
  • centos防火墙配置「建议收藏」

    centos防火墙配置「建议收藏」centos防火墙配置1.centos中firewalld与iptablescentos7以前的版本默认使用iptables服务进行管理防火墙规则。centos7以及其以上版本默认使用firewalld服务管理防火墙。所以在centos8中,就使用其默认的firewalld配置防火墙。2.firewalld相关命令进程与状态相关systemctlstartfirewalld.service#启动防火墙systemctlstopfirewalld.servic

  • 一只救助犬的最后遗言

    一只救助犬的最后遗言这是刚在雅虎上看到的一篇文章,内容讲述一只日本救助犬的真实而动人的故事,阅后不得不让人感叹人与动物之间的感情和谐与真挚。实话说,其令我这个大男人哽咽难语。想想现今,在这个人与人之间充满了不信任,在这

  • vue 父组件调用子组件的方法_vue子组件修改父组件值

    vue 父组件调用子组件的方法_vue子组件修改父组件值我们都知道通过$ref可以获取到某个DOM,但是它也可以用来获取子组件的实例,调用子组件的方法例:子组件:<template><div></div></template><script>exportdefault{methods:{c

  • 创建外部用户_外部表

    创建外部用户_外部表

  • 二进制加减法计算法则

    二进制加减法计算法则一、二进制加法(逢2进1)举例:100111+11010=10000110011111010——————100001十进制加法是逢十进一,二进制加法是逢二进一。最低位:1加0得1。倒数第2位:1加1得2,同时进1。倒数第3位:1加0得1,再加上进位的1,结果为2。其他位同理。二、二进制减法(借1当2)举例:1000001-11010=100111…

发表回复

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

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