微信小程序之onLaunch與onload異步問題詳解
所述問題:
前端時(shí)間開發(fā)了一個(gè)微信小程序商城項(xiàng)目,因?yàn)檫@個(gè)項(xiàng)目我們的需求是進(jìn)入小程序就通過wx.login({}) 這個(gè)api進(jìn)行用戶登錄,獲取系統(tǒng)后臺(tái)的用戶基本信息。再此之前,一直以為微信小程序中的App.js 中onLaunch (小程序初始化完成執(zhí)行該方法)方法比其他頁面的的 onload 方法要先執(zhí)行。那么問題就來了,我每次進(jìn)入小程序首頁的時(shí)候有時(shí)候會(huì)先執(zhí)行onlaunch方法,有時(shí)又會(huì)先執(zhí)行首頁的onload的方法,最后經(jīng)過確定,在微信小程序中這兩個(gè)方法并沒有執(zhí)行先后的順序,因?yàn)樗麄兌际钱惒綀?zhí)行的。當(dāng)然開發(fā)過微信小程序的開發(fā)者都知道微信請求數(shù)據(jù)都是異步執(zhí)行的,如在同一個(gè)onload寫兩個(gè)請求數(shù)據(jù)的方法,它不一定會(huì)按照先后順序去執(zhí)行,這就是傳說中的異步地獄了。
解決方法:
當(dāng)然,我既然知道這個(gè)執(zhí)行順序是由于微信小程序的異步執(zhí)行請求原因?qū)е碌摹N覀兛梢允褂肞romise 來解決異步編程問題啦。我的解決方法是,首先我是在app.js 中定義了一個(gè)全局方法,用來登錄小程序請求用戶信息的接口,每次進(jìn)入首頁的時(shí)候先判斷我是否已有用戶信息緩存,假如不存在那么請求app.js中的全局方法進(jìn)行數(shù)據(jù)獲取。在這里我就不詳細(xì)介紹Promise 的基本用法了,因?yàn)槿钜环逡呀?jīng)將的非常詳細(xì)了,大家可以點(diǎn)擊查看【 http://es6.ruanyifeng.com/#docs/promise#Promise-all 】。
方法實(shí)現(xiàn):
App.js方法實(shí)現(xiàn):
App({
onLaunch: function() {
console.log('App Launch')
//不在這里默認(rèn)請求
},
/**
* 定義全局變量
*/
globalData: {
openid: '', //用戶openid
userId: '', //用戶編號(hào)
},
/**
* 用戶登錄請求封裝(解決onlaunch和onload執(zhí)行順序問題)
*/
userLogin: function() {
var that = this;
//定義promise方法
return new Promise(function(resolve, reject) {
// 調(diào)用登錄接口
wx.login({
success: function(res) {
if (res.code) {
console.log("用戶登錄授權(quán)code為:" + res.code);
//調(diào)用wx.request請求傳遞code憑證換取用戶openid,并獲取后臺(tái)用戶信息
wx.request({
url: 'https://www.xxxx.xxx.api', // 后臺(tái)請求用戶信息方法【注意,此處必須為https數(shù)字加密證書】
data: {
code: res.code //code憑證
},
header: {
'content-type': 'application/json' // 默認(rèn)值
},
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機(jī)制放回成功數(shù)據(jù)
resolve(res.data);
} else {
reject('error');
}
},
fail: function(res) {
reject(res);
wx.showToast({
title: '系統(tǒng)錯(cuò)誤'
})
},
complete: () => {
} //complete接口執(zhí)行后的回調(diào)函數(shù),無論成功失敗都會(huì)調(diào)用
})
}
else
{
reject("error");
}
}
})
})
}
});
index.js實(shí)現(xiàn):
const app=getApp();//初始化app.js
page({
onLoad: function (option) {
var that = this;
let UserId = wx.getStorageSync("userId");
console.log("進(jìn)入首頁的用戶編號(hào)為:" + UserId);
if (UserId == '') {
app.userLogin().then(res => {
console.log("promise回調(diào)后的數(shù)據(jù):");
console.log(res);
if (res.errcode == 0) {
//把首頁需要請求的數(shù)據(jù)接口都提取到一個(gè)自定義方法中
that.GetData();
}
})
}
else
{
//用戶緩存存在
that.GetData();
}
}
,
GetData()
{
//需要用到用戶編號(hào)換取商品信息的接口
}
})
總結(jié):
當(dāng)然解決異步回調(diào)的方法有很多種,不過我在這里只說我認(rèn)為好用的一種,大家有什么想法也可以一起分享學(xué)習(xí)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript實(shí)現(xiàn)當(dāng)網(wǎng)頁加載完成后執(zhí)行指定函數(shù)的方法
這篇文章主要介紹了JavaScript實(shí)現(xiàn)當(dāng)網(wǎng)頁加載完成后執(zhí)行指定函數(shù)的方法,實(shí)例分析了javascript加載頁面及執(zhí)行函數(shù)的技巧,需要的朋友可以參考下2015-03-03
如何用js判斷當(dāng)前是否是企業(yè)微信環(huán)境還是微信環(huán)境
這篇文章主要給大家介紹了關(guān)于如何用js判斷當(dāng)前是否是企業(yè)微信環(huán)境還是微信環(huán)境的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2024-04-04
靈活應(yīng)用js調(diào)試技巧解決樣式問題的步驟分享
在很多時(shí)候,前端開發(fā)人員使用JS腳本,對頁面Dom結(jié)構(gòu)或者是樣式做出了修改,會(huì)造成一些意想不到的bug2012-03-03
javascript設(shè)置文本框光標(biāo)的方法實(shí)例小結(jié)
這篇文章主要介紹了javascript設(shè)置文本框光標(biāo)的方法,結(jié)合實(shí)例形式總結(jié)分析了javascript針對文本框光標(biāo)的位置、設(shè)置及文本操作的相關(guān)技巧,需要的朋友可以參考下2016-11-11
echarts設(shè)置暫無數(shù)據(jù)方法實(shí)例及遇到的問題
Echarts是百度旗下的一款開源的商業(yè)級(jí)數(shù)據(jù)可視化產(chǎn)品,具有豐富的圖表類型,下面這篇文章主要給大家介紹了關(guān)于echarts設(shè)置暫無數(shù)據(jù)方法及遇到的問題的相關(guān)資料,需要的朋友可以參考下2022-12-12
JavaScript實(shí)現(xiàn)帶粒子效果的進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)帶粒子效果的進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
Javascript下的urlencode編碼解碼方法附decodeURIComponent
而本文,就大概說說如何在js中通過系統(tǒng)自帶的函數(shù)去解決這個(gè)問題。2010-04-04

