實現wx小程式API的 Promise化

C+ 安口木發表於2020-11-22
  1. 基於回撥函式的非同步 API 的缺點
    預設情況下,小程式官方提供的非同步 API 都是基於回撥函式實現的,例如,網路請求的 API 需要按照
    如下的方式呼叫:
wx.request({
  method: '',
  url: '',
  data: {},
  success: () => {}, // 成功的回撥
  complate: () => {}, // 無論成功與否都會執行的回撥
  fail: () => {} // 失敗的回撥
})

這種程式碼的缺點是顯而易見的, 容易造成回撥地獄的問題,程式碼的可讀性、維護性差!而我們就想將這
種型別的程式碼使用 API Promise 化進行改造。
2. 什麼是 API Promise 化
API Promise 化,指的是通過額外的配置,將官方提供的、基於回撥函式的非同步 API ,升級改造為基
於 Promise 的非同步 API ,從而提高程式碼的可讀性、維護性,避免回撥地獄的問題。
3. 實現 API Promise 化
在小程式中,實現 API Promise 化主要依賴於 miniprogram-api-promise 這個第三方的 npm 包。
它的安裝和使用步驟如下:

npm i --save miniprogram-api-promise@1.0.4
- 下載完成,我們不能直接使用,而是需要再次重新構建npm包
- 建議在構建前先刪除原有的miniprogram_npm
- 然後再點選工具,構建npm

匯入並執行:

// 在小程式入口檔案中(app.js),只需要呼叫一次 promisifyAll()方法
// 即可實現非同步API 的Promise化
// 按需匯入一個方法
import { promisifyAll } from 'miniprogram-api-promise'
// 宣告一個常量,為一個空物件,
// 並在wx頂級物件下新增一個屬性p也指向該空物件,使所有成員都可以使用該物件
const wxp = wx.p = {}
// promisify all wx's api
// 引數1: wx頂級物件
// 引數2: wxp指向一個空物件
promisifyAll(wx, wxp)

解釋上述程式碼:
promisifyAll : 做的事就是將 wx 擁有的屬性方法都copy並改造了一份給了 wxp 這個物件。
然而, wxp 只是當前 js 檔案的一個常量,只能在當前檔案使用。
因此:我們在 wx 上掛載一個屬性 p 讓他和 wxp 指向同一個空物件。
在其他頁面或者元件就可以通過全域性物件 wx 點出 p 來訪問到 wxp。
此時 wx.p 發起非同步的請求時,得到的是一個 promise 物件。
那麼我們就可以使用 async/await 簡化Promise語法。

相關文章