Skip to content

promisify() 方法解析

杨俊宁 edited this page Apr 16, 2018 · 4 revisions

本库的核心代码如下:

// 把普通函数变成promise函数
const promisify = (api) => {
  return (options, ...params) => {
    return new Promise((resolve, reject) => {
      api(Object.assign({}, options, {
        success: resolve,
        fail: reject
      }), ...params)
    })
  }
}

最外层传入 api 返回的是一个方法,该方法返回一个另一个方法(这个方法就是最后得到的方法),这个方法返回一个 Promise 对象。

wx.login 做个例子:

这里 wx.login 就成了这样一个方法:

const wx.login = (options, ...params) => {
    return new Promise((resolve, reject) => {
        //...
    });
}

我们会把重构过的 wx.login 传递给 wx.pro.login 对象保存起来。

此时调用 wx.pro.login 的话就会得到一个 Promise 对象,就可以使用 thencatch 了:

wx.pro.login(options).then((res)=>{
    //success
}).catch((res)=>{
    //fail
})

...params 的话你可以试一下这个函数就知道是什么作用了:

function test(a, ...params) {
    console.log('a='+a)
    console.log(params)
}

大概意思就是可以传入任意长度的参数,比如 test(1, 11, 22) 除了第一个 a ,其他都会放在 params 里面,params 是一个数组。

a => 1
params => [11, 22]
Clone this wiki locally