??回調地獄一向是影響開發(fā)和維護的癥結所在弓摘,無數(shù)個success()
的嵌套再嵌套陨瘩,導致代碼層級頗深娜膘,盤一次邏輯都要費勁千辛萬苦逊脯,ES6語法中的Promise
,便是專為解決JS中異步請求回調的信任問題而存在的劲绪,結合小程序目前提供的API支持男窟,可以用Promise
將其進行簡單封裝,優(yōu)化性能體驗贾富。具體代碼如下(注意看注釋):
??1. 首先在公共的util.js
(或者自己創(chuàng)建的公有JS文件)中加入如下方法:
/**
* wxPromisify 使用promise封裝request請求
* @fn 傳入的函數(shù)歉眷,如wx.request、wx.download
*/
function wxPromisify(fn) {
return function(obj = {}) {
return new Promise((resolve, reject) => {
obj.success = function(res) { //網(wǎng)絡通暢颤枪,請求發(fā)送成功
console.log(res)
if (res.data.code == 200) { //判斷后臺返回的狀態(tài)碼汗捡,若是成功,返回resolve()
return resolve(res)
} else { //若是返回錯誤的狀態(tài)碼畏纲,彈窗提示失敗信息扇住,并附帶錯誤代碼,以便快速定位問題所在
wx.showModal({
title: res.data.msg,
content: "錯誤碼:" + res.data.code,
showCancel: false,
})
}
}
obj.fail = function(res) { //網(wǎng)絡阻塞盗胀,請求發(fā)送失敗艘蹋,顯示錯誤提示
showError() //此函數(shù)在下面定義,用于打印錯誤信息
return reject(res)
}
fn(obj) //執(zhí)行函數(shù)票灰,obj為傳入函數(shù)的參數(shù)
})
}
}
/**
* 加載超時后顯示網(wǎng)絡錯誤提示
* 當前設置為等待2.5秒女阀,若超時后仍未返回請求結果,彈窗提示網(wǎng)絡錯誤
* @param 傳入一個Promise對象
*/
function racePromise(proRequest){
return Promise.race([
proRequest,
new Promise(function (resolve, reject) {
setTimeout(() => reject(), 2500)
})
])
}
/**
* 彈窗提示網(wǎng)絡錯誤
*/
function showError(){
wx.showModal({
title: '加載失敗',
content: '請檢查網(wǎng)絡連接',
showCancel: false,
})
}
??最后將方法導出:
module.exports = {
URL: "https://...", //具體的請求地址頭
wxPromisify: wxPromisify,
racePromise: racePromise,
showError: showError,
}
??2. 在wxml中進行調用屑迂,首先在Page
上方引入util.js
文件浸策,并封裝部分方法:
const util = require('../../utils/util.js')
//調用util.js里寫好的方法,將小程序原生的request方法包裝成一個Promise對象
//這里也可以傳入其他原生請求惹盼,如wx.getSystemInfo庸汗、wx.getUserInfo、wx.login等手报,但需要將util.js里的‘判斷狀態(tài)碼’這一步刪掉
const proRequest = util.wxPromisify(wx.request)
??然后在方法里進行調用蚯舱,發(fā)送請求:
/**
* 通過code獲取用戶openid
*/
getOpenid(code) {
var that = this; //個人習慣,為避免this指向出錯掩蛤,函數(shù)前必加
util.racePromise(proRequest({
url: util.URL + "...?code=" + code, //請求地址
method: 'POST', //函數(shù)方法
})).then(res => { //O怼!盏档!注意括號的個數(shù)!T镆蜈亩!
/* ... */ //若是請求成功懦窘,執(zhí)行后續(xù)處理和操作 res是請求響應的結果
}).catch(res => { //若是請求超時,則catch進行捕獲稚配,彈窗提示網(wǎng)絡錯誤
util.showError()
})
},
??以上便是簡單的封裝方法畅涂,并處理了基本錯誤,后續(xù)可以根據(jù)需求添加Promise.all
等方法道川,完善業(yè)務邏輯午衰。
??如有不妥之處,萬望指正冒萄!