如何Promisify具有多个回调参数的函数?

时间:2017-10-12 19:31:55

标签: javascript ecmascript-6 bluebird es6-promise

我有很多函数可以接受两个回调和一些我想要Promisify的参数。 例如:

function myFunction(successCallback, failureCallback, someParam)

鉴于以上功能,我如何使用诸如Bluebird之类的Promise库来同化successCallbackfailureCallback

我试过了,但它会返回undefined

const myFunctionAsync = Promise.promisify(myFunction);
console.log(await myFunctionAsync('someParam')); // undefined

一个有效但过于冗长的解决方案:

const myFunctionAsync = new Promise((resolve, reject) => 
    myFunction(success => resolve(success), failure => reject(failure))
);
console.log(await myFunctionAsync('someParam')); // success

我正在寻找一种方法将这些笨拙的多个回调函数转换为Promise而不包装每个回调函数。

非常感谢。

2 个答案:

答案 0 :(得分:2)

您可以编写自己的promisify函数版本,将函数签名考虑在内:

function myFunction(successCallback, failureCallback, someParam) {
    setTimeout(_ => successCallback('ok:' + someParam), 100);
}

function myPromisify(f) {
    return function(...args) {
        return new Promise( (resolve, reject) => f(resolve, reject, ...args) );
    }
}

async function test() {
    const myFunctionAsync = myPromisify(myFunction);
    console.log(await myFunctionAsync('someParam')); // success
}

test();

答案 1 :(得分:1)

蓝鸟或其他方式,宣传功能并不难。您的解决方案 过于冗长。尝试:

const myFunctionAsync = (...a) => new Promise((r, e) => myFunction(r, e, ...a));

是的,这是包装每一个,但是每个函数只有一行,除非你的函数都遵循某种模式并且你将它们放在数组中,这并不是什么大问题。即你假设额外的args在最后而不是开头。