如何 Promisify 具有多个回调参数的函数?
How to Promisify a function that has multiple callback parameters?
我编写了一些函数来接受两个回调和一些我想 Promisify 的参数。
示例:
function myFunction(successCallback, failureCallback, someParam)
鉴于上述功能,我将如何使用 Promise 库(例如 Bluebird)对 successCallback
和 failureCallback
进行 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。您假设附加参数位于末尾而不是开头。
我编写了一些函数来接受两个回调和一些我想 Promisify 的参数。 示例:
function myFunction(successCallback, failureCallback, someParam)
鉴于上述功能,我将如何使用 Promise 库(例如 Bluebird)对 successCallback
和 failureCallback
进行 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。您假设附加参数位于末尾而不是开头。