[英]How to promisify a function when the callback takes multiple arguments
[英]How to Promisify a function that has multiple callback parameters?
我编写了许多函数来接受两个回调和一些我想承诺的参数。 例:
function myFunction(successCallback, failureCallback, someParam)
给定上述功能,我将如何使用Promise库(例如Bluebird)来实现successCallback
和failureCallback
?
我已经试过了,但是返回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));
是的,这包装了每个包装,但是每个功能只有一行,除非您的所有功能都遵循某种模式并且将它们排列在数组中,否则没什么大不了的。 也就是说,您假设其他参数位于结尾而不是开头。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.