实现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 包。
它的安装和使用步骤如下:

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语法。

本文链接http://element-ui.cn/article/show-298659.aspx