實現wx小程序API的 Promise化

  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 包。
它的安裝和使用步驟以下:javascript

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

導入並執行:java

// 在小程序入口文件中(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語法。web