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

问题描述:

我有一些函数被写为接受两个回调函数和一些我想Promisify的参数。 例子:如何提升具有多个回调参数的函数?

function myFunction(successCallback, failureCallback, someParam) 

鉴于上述功能,我将如何Promisify两个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 

我正在寻找一种方式将这些尴尬多个回调函数转换成承诺没有包装每一个。

非常感谢。

+0

那么你需要在承诺中创建(包装)你的回调。无论你自己做还是图书馆有一个方便的实用方法,它似乎是同样的事情。 –

+0

的确如此,也许我太担心Promisify函数,它对于最后一个参数是回调的Node样式函数非常有用。 – Robula

你可以写你自己的一个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();

+0

我明显地反映了这一点,一个简单的包装功能是我所需要的。对于'myPromisify'也很好用。谢谢! – Robula

蓝鸟或以其他方式,它并不难promisify功能。您的解决方案过度冗长。尝试:

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

啊,这是每包一个,但每个功能一行,除非你的函数的所有遵循某种模式,你有他们在阵,这不是什么大不了的事。即你假设更多的参数在最后而不是开始。