小程式使用Promise簡化回調,promise回調
Promise 是非同步編程的一種解決方案,比傳統的解決方案——回呼函數和事件——更合理和更強大。它由社區最早提出和實現,ES6 將其寫進了語言標準,統一了用法,原生提供了Promise對象。
所謂Promise,簡單說就是一個容器,裡面儲存著某個未來才會結束的事件(通常是一個非同步作業)的結果。從文法上說,Promise 是一個對象,從它可以擷取非同步作業的訊息。Promise 提供統一的 API,各種非同步作業都可以用同樣的方法進行處理。
瞭解什麼是 Promise 對象
在項目中,會出現各種非同步作業,如果一個非同步作業的回調裡還有非同步作業,就會出現回調金字塔。
比如下面這種
// 類比擷取code,然後將code傳給後台,成功後擷取userinfo,再將userinfo傳給後台// 登入wx.login({ success: res => { let code = res.code // 請求 imitationPost({ url: '/test/loginWithCode', data: { code }, success: data => { // 擷取userInfo wx.getUserInfo({ success: res => { let userInfo = res.userInfo // 請求 imitationPost({ url: '/test/saveUserInfo', data: { userInfo }, success: data => { console.log(data) }, fail: res => { console.log(res) } }) }, fail: res => { console.log(res) } }) }, fail: res => { console.log(res) } }) }, fail: res => { console.log(res) }})
下面分析如何用Promise來進行簡化代碼
因為小程式非同步api都是success和fail的形式,所有有人封裝了這樣一個方法:
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=>{})
getSystemInfo
可以看到簡化後的回調裡少了一個縮排,並且回呼函數從9行減少到了6行。
回調金字塔的簡化效果
那麼再來看看最開始的那個回調金字塔
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)})
簡化回調
可以看到簡化效果非常明顯。
同樣適用於網頁或者nodejs等中。
參考
Promise 對象
原始碼
tomfriwel/MyWechatAppDemo 的promisePage頁面
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。