微信小程序異步處理
發表時(shí)間:2022-9-6
發布人(rén):融晨科技
浏覽次數:50
直接看問題:
然後看打印的(de)結果:
根據上(shàng)面兩圖可以(yǐ)看出(chū),代碼上(shàng)先執行的(de)網絡請求,再執行打印的(de)變量,但是(shì)從下面打印的(de)結果來(lái)看,先出(chū)結果的(de)是(shì)執行打印變量的(de)函數(aafn函數),再打印出(chū)網絡請求success的(de)回調裏返回的(de)數據和(hé / huò)賦值後的(de)變量的(de)值;
爲(wéi / wèi)什麽先執行的(de)aafn,并且打印的(de)值沒有賦值上(shàng)?
因爲(wéi / wèi)wx.request是(shì)一個(gè)異步的(de)請求,所以(yǐ)數據請求的(de)同時(shí),可以(yǐ)繼續向下執行函數。所以(yǐ)這(zhè)裏值還沒有賦值上(shàng)就(jiù)開始打印了(le/liǎo)變量的(de)值;
這(zhè)種情況,怎麽解決呢?
方法一: 嵌套
在(zài)wx.request的(de)success回調裏執行aafn函數
然後運行結果
這(zhè)裏就(jiù)取到(dào)值了(le/liǎo)
但是(shì)如果邏輯很複雜,需要(yào / yāo)用到(dào)很多層異步,就(jiù)像這(zhè)樣:
asyncFn1(function(){
//...
asyncFn2(function(){
//...
asyncFn3(function(){
//...
asyncFn4(function(){
//...
asyncFn5(function(){
//...
});
});
});
});
});
這(zhè)樣代碼看起來(lái)就(jiù)很不(bù)好看,代碼的(de)可讀性和(hé / huò)可維護性就(jiù)不(bù)好了(le/liǎo)
那怎麽解決這(zhè)個(gè)問題呢?Promise這(zhè)種概念的(de)産生,很好地(dì / de)解決了(le/liǎo)這(zhè)一切,Promise是(shì)什麽?這(zhè)裏我就(jiù)不(bù)多說(shuō)了(le/liǎo)有興趣的(de)自己去看一看, Promise介紹鏈接
先看看Promise的(de)方式:
function asyncFn1(){
return new Promise(function (resolve, reject) {
//...
})
}
// asyncFn2,3,4,5也(yě)實現成跟asyncFn1一樣的(de)方式...
調用
asyncFn1()
.then(asyncFn2)
.then(asyncFn3)
.then(asyncFn4)
.then(asyncFn5);
這(zhè)樣的(de)話,異步函數就(jiù)可以(yǐ)依次執行了(le/liǎo)
微信小程序的(de)異步API怎麽支持Promise呢?
我們可以(yǐ)一個(gè)一個(gè)的(de)用Promise去包裝這(zhè)些API,但是(shì)這(zhè)個(gè)還是(shì)比較麻煩的(de)。不(bù)過,小程序的(de)API的(de)參數格式都比較統一,隻接受一個(gè)object參數,回調都是(shì)在(zài)這(zhè)個(gè)參數中設置,所以(yǐ),這(zhè)爲(wéi / wèi)了(le/liǎo)統一處理提供了(le/liǎo)便利,寫一個(gè)工具方法,來(lái)完成這(zhè)樣的(de)工作
首先需要(yào / yāo)引用一個(gè)叫bluebird.js的(de)文件;
進入 bluebird官網 下載:
這(zhè)個(gè)好像是(shì)不(bù)能下載的(de),但是(shì)你可以(yǐ)點擊進入,然後複制,在(zài)小程序裏創建一個(gè)js文件,将代碼複制到(dào)這(zhè)個(gè)js裏面,然後引用
然後再寫一個(gè)JS,裏面寫工具方法:
下面是(shì)prom.js
然後需要(yào / yāo)使用的(de)那個(gè)頁面的(de)js裏引入prom.js:
調用:
打印結果
這(zhè)樣就(jiù)可以(yǐ)了(le/liǎo),完結。