我有很多函数可以接受两个回调和一些我想要Promisify的参数。 例如:
function myFunction(successCallback, failureCallback, someParam)
鉴于以上功能,我如何使用诸如Bluebird之类的Promise库来同化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
我正在寻找一种方法将这些笨拙的多个回调函数转换为Promise而不包装每个回调函数。
非常感谢。
答案 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在最后而不是开头。