微信小程序api promise化

  • 邢毅彪
  • 8 Minutes
  • 2018年7月20日

前言

众所周知,js的异步经历了cb => generator => promise => async await ;每一步的进化,其实都是js开发者对于异步变成的重大改进, nodejs的框架是最好的证明express(cb) => koa1(generator) => koa2(promise/async await);

微信小程序自发布以来, 引来的无数开发者的目光,然后小程序版本的更新,只是带来的功能上的增加,对于开发者的开发体验改变不大(除了即将要到来的支持分包加载和npm),微信小程序官方提供的例如网络请求和文件操作的需要异步操作的api,无一例外是采用最原始的cb方式来编程,这在已经es2018的今天,是无法忍受的。

这里提供一个思路,用以将微信小程序的原生api转换成promise,以便可以更爽的使用, 先贴上github

实现

  1. 因为api众多,逐一实现也不现实, 我们先写一个工厂方法,用以将api接口promise化, 并且导出,让使用者在使用过程中可以根据自己的需要转换接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* 全部设置promis工厂方法
* @param {function} target
* @param {object} option
* @return Promise<any>
*/
export function toPromisify(target) {
if (target) {
return (arg) => new Promise((resolve, reject) => {
arg.success = (res) => {
resolve(res)
}

arg.fail = (err) => {
reject(err)
}

target(arg)
})
}
}
  1. 将现有的异步方法(有success和fail方法的api)全部转换并导出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const funcs = [
'request',
'uploadFile',
// ...
]

export const promisifys = {}

funcs
.forEach((f) => {
if (wx[f]) {
promisifys[f] = toPromisify(wx[f])
}
})

至此,我们已经将所有的现有api全部转换成了promise。

使用

  1. 本地使用
    如果你的环境是原生环境,即没有使用npm,可以直接去github下载源码,然后导入使用,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 引入方法
import { promisifys, toPromisify } from './promisy.js'

// 以request举例,其他同理
promisifys.request({url: 'xxx'})
.then((res) => {
// TODO somethings
}).catch((err) => {
// TODO somethings
})


// 亦可以使用工厂方法构造自己的promise

const func = toPromisify(wx.xxx)

func(option)
.then((res) => {
// TODO somethings
}).catch((err) => {
// TODO somethings
})
  1. 如果你使用其他小程序框架(mpvue,wepy等),可以使用npm环境,可以先在npm下载本包,然后导入使用,使用方法同上。
1
2
3
npm install wx-promisfy --save-dev
#or
yarn add wx-promisfy
访问量