您當前位置>首頁 » 新聞資(zī)訊 » 小程序相關(guān) >
微信小程序:使用Promise簡化回調
發表時間:2021-3-31
發布人:葵宇科技
浏覽次數:37
了解什麼是 Promise 對象
在項目中(zhōng),會出現各種異步操作,如(rú)果一個(gè)異步操作的回調裡還有異步操作,就會出現回調金字塔。
比如(rú)下(xià)面這種
// 模拟獲取code,然後将code傳給後台,成功後獲取userinfo,再将userinfo傳給後台
// 登錄
wx.login({
success: res => {
let code = res.code
// 請求
imitationPost({
url: '/test/loginWithCode',
data: {
code
},
success: data =https://www.wxapp-union.com/> {
// 獲取userInfo
wx.getUserInfo({
success: res => {
let userInfo = res.userInfo
// 請求
imitationPost({
url: '/test/saveUserInfo',
data: {
userInfo
},
success: data =https://www.wxapp-union.com/> {
console.log(data)
},
fail: res => {
console.log(res)
}
})
},
fail: res => {
console.log(res)
}
})
},
fail: res => {
console.log(res)
}
})
},
fail: res => {
console.log(res)
}
})
下(xià)面分析如(rú)何用Promise來進行簡化代碼
因為微信小程序異步api都是success和(hé)fail的形式,所有有人封裝了這樣一個(gè)方法:
promisify.js
module.exports = (api) => {
return (options, ...params) => {
return new Promise((resolve, reject) => {
api(Object.assign({}, options, { success: resolve, fail: reject }), ...params);
});
}
}
先看最簡單的:
// 獲取系統信息
wx.getSystemInfo({
success: res => {
// success
console.log(res)
},
fail: res => {
}
})
使用上面的promisify.js
簡化後:
const promisify = require('./promisify')
const getSystemInfo = promisify(wx.getSystemInfo)
getSystemInfo().then(res=>{
// success
console.log(res)
}).catch(res=>{
})
可(kě)以看到簡化後的回調裡少(shǎo)了一個(gè)縮進,并且回調函數從9行減少(shǎo)到了6行。
回調金字塔的簡化效果
那麼再來看看最開始的那個(gè)回調金字塔
const promisify = require('./promisify')
const login = promisify(wx.login)
const getSystemInfo = promisify(wx.getSystemInfo)
// 登錄
login().then(res => {
let code = res.code
// 請求
pImitationPost({
url: '/test/loginWithCode',
data: {
code
},
}).then(data => {
// 獲取userInfo
getUserInfo().then(res => {
let userInfo = res.userInfo
// 請求
pImitationPost({
url: '/test/saveUserInfo',
data: {
userInfo
},
}).then(data => {
console.log(data)
}).catch(res => {
console.log(res)
})
}).catch(res => {
console.log(res)
})
}).catch(res => {
console.log(res)
})
}).catch(res => {
console.log(res)
})
可(kě)以看到簡化效果非常明顯。
同樣适用于網頁或者nodejs等中(zhōng)。
參考
- Promise 對象
源代碼
- tomfriwel/MyWechatAppDemo 的
promisePage
頁面