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

How to Promisify a function that has multiple callback parameters?

我编写了一些函数来接受两个回调和一些我想 Promisify 的参数。 示例:

function myFunction(successCallback, failureCallback, someParam)

鉴于上述功能,我将如何使用 Promise 库(例如 Bluebird)对 successCallbackfailureCallback 进行 Promisify?

我已经试过了,但是它 returns 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

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

非常感谢。

您可以编写自己的 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();

Bluebird 或其他,承诺功能并不难。您的解决方案 过于冗长。尝试:

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

是的,这是对每个函数进行包装,但是每个函数一行,除非您的函数都遵循某种模式并且您将它们放在数组中,否则这没什么大不了的。 IE。您假设附加参数位于末尾而不是开头。