微信小程序之onLaunch與onload異步問(wèn)題詳解
所述問(wèn)題:
前端時(shí)間開(kāi)發(fā)了一個(gè)微信小程序商城項(xiàng)目,因?yàn)檫@個(gè)項(xiàng)目我們的需求是進(jìn)入小程序就通過(guò)wx.login({}) 這個(gè)api進(jìn)行用戶登錄,獲取系統(tǒng)后臺(tái)的用戶基本信息。再此之前,一直以為微信小程序中的App.js 中onLaunch (小程序初始化完成執(zhí)行該方法)方法比其他頁(yè)面的的 onload 方法要先執(zhí)行。那么問(wèn)題就來(lái)了,我每次進(jìn)入小程序首頁(yè)的時(shí)候有時(shí)候會(huì)先執(zhí)行onlaunch方法,有時(shí)又會(huì)先執(zhí)行首頁(yè)的onload的方法,最后經(jīng)過(guò)確定,在微信小程序中這兩個(gè)方法并沒(méi)有執(zhí)行先后的順序,因?yàn)樗麄兌际钱惒綀?zhí)行的。當(dāng)然開(kāi)發(fā)過(guò)微信小程序的開(kāi)發(fā)者都知道微信請(qǐng)求數(shù)據(jù)都是異步執(zhí)行的,如在同一個(gè)onload寫兩個(gè)請(qǐng)求數(shù)據(jù)的方法,它不一定會(huì)按照先后順序去執(zhí)行,這就是傳說(shuō)中的異步地獄了。
解決方法:
當(dāng)然,我既然知道這個(gè)執(zhí)行順序是由于微信小程序的異步執(zhí)行請(qǐng)求原因?qū)е碌?。我們可以使用Promise 來(lái)解決異步編程問(wèn)題啦。我的解決方法是,首先我是在app.js 中定義了一個(gè)全局方法,用來(lái)登錄小程序請(qǐng)求用戶信息的接口,每次進(jìn)入首頁(yè)的時(shí)候先判斷我是否已有用戶信息緩存,假如不存在那么請(qǐng)求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)請(qǐng)求 }, /** * 定義全局變量 */ globalData: { openid: '', //用戶openid userId: '', //用戶編號(hào) }, /** * 用戶登錄請(qǐng)求封裝(解決onlaunch和onload執(zhí)行順序問(wèn)題) */ 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請(qǐng)求傳遞code憑證換取用戶openid,并獲取后臺(tái)用戶信息 wx.request({ url: 'https://www.xxxx.xxx.api', // 后臺(tái)請(qǐng)求用戶信息方法【注意,此處必須為https數(shù)字加密證書(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ù),無(wú)論成功失敗都會(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)入首頁(yè)的用戶編號(hào)為:" + UserId); if (UserId == '') { app.userLogin().then(res => { console.log("promise回調(diào)后的數(shù)據(jù):"); console.log(res); if (res.errcode == 0) { //把首頁(yè)需要請(qǐng)求的數(shù)據(jù)接口都提取到一個(gè)自定義方法中 that.GetData(); } }) } else { //用戶緩存存在 that.GetData(); } } , GetData() { //需要用到用戶編號(hào)換取商品信息的接口 } })
總結(jié):
當(dāng)然解決異步回調(diào)的方法有很多種,不過(guò)我在這里只說(shuō)我認(rèn)為好用的一種,大家有什么想法也可以一起分享學(xué)習(xí)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
javascript 圖片上傳預(yù)覽-兼容標(biāo)準(zhǔn)
js圖片上傳預(yù)覽2009-06-06js實(shí)現(xiàn)登錄時(shí)記住密碼的方法分析
這篇文章主要介紹了js實(shí)現(xiàn)登錄時(shí)記住密碼的方法,結(jié)合實(shí)例形式分析了JavaScript基于cookie實(shí)現(xiàn)存儲(chǔ)登錄密碼相關(guān)操作技巧,需要的朋友可以參考下2020-04-04JavaScript學(xué)習(xí)筆記之?dāng)?shù)組基本操作示例
這篇文章主要介紹了JavaScrip學(xué)習(xí)筆記之?dāng)?shù)組基本操作,結(jié)合實(shí)例形式分析了javascript數(shù)組的基本定義、添加、刪除、修改、連接、排序等操作技巧,需要的朋友可以參考下2019-01-01談?wù)凱HP中相對(duì)路徑的問(wèn)題與絕對(duì)路徑的使用
經(jīng)??吹接腥瞬仍诹薖HP路徑的坑上面了,感覺(jué)有必要來(lái)說(shuō)說(shuō)PHP中相對(duì)路徑的一些坑,以及PHP中絕對(duì)路徑的使用,下面一起來(lái)看看。2016-08-08JavaScript實(shí)現(xiàn)鼠標(biāo)拖拽調(diào)整div大小
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)鼠標(biāo)拖拽調(diào)整div大小,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03JS實(shí)現(xiàn)iframe中子父頁(yè)面跨域通訊的方法分析
這篇文章主要介紹了JS實(shí)現(xiàn)iframe中子父頁(yè)面跨域通訊的方法,結(jié)合實(shí)例形式分析了JS實(shí)現(xiàn)iframe頁(yè)面跨域通訊常見(jiàn)操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2020-03-03JavaScript實(shí)現(xiàn)動(dòng)態(tài)數(shù)字時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)動(dòng)態(tài)數(shù)字時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05微信小程序?qū)崿F(xiàn)購(gòu)物車代碼實(shí)例詳解
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)購(gòu)物車代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08javascript 簡(jiǎn)練的幾個(gè)函數(shù)
看CSDN上別人的代碼,感覺(jué)比較精煉,拿來(lái)主義,需要的朋友可以看下。2009-08-08