2017-10-12 189 views
0

我有一些函數被寫爲接受兩個回調函數和一些我想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

回答

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();

+0

我明顯地反映了這一點,一個簡單的包裝功能是我所需要的。對於'myPromisify'也很好用。謝謝! – Robula

1

藍鳥或以其他方式,它並不難promisify功能。您的解決方案過度冗長。嘗試:

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

啊,這是每包一個,但每個功能一行,除非你的函數的所有遵循某種模式,你有他們在陣,這不是什麼大不了的事。即你假設更多的參數在最後而不是開始。