2016-02-20 70 views
1

我在寫一些nodejs應用程序。我的應用程序對某些npm模塊有一些依賴性。混合異步操作(回調和承諾)完成後如何執行任務?

在一個任務中,它涉及到兩個異步操作,兩個異步操作是以回調和承諾的形式。下面我把一些示例代碼:

// the task which should be performed after async operation 
var myTask = function(){ 
    // do something 
} 

// first async operation in the form of callback 
cbapi(myTask) 

// second async operation in the form of promise 
promiseapi() 
.then(myTask) 

在上面的例子中,myTask將兩次當第一異步和第二異步操作完成執行。但是我想要的是隻有在兩個異步操作完成後才執行一次。

有沒有辦法做到這一點?

+1

請勿混用回調和承諾,promisify回調的API,然後調用的API promisified – Esailija

+1

沒有看到代碼,它很難幫助你,但什麼Esailija告訴就像是一個經驗法則。 – thefourtheye

回答

0

附近建立你的回調函數調用一個新的承諾,並在兩個呼叫使用Promise.all

Promise.all([new Promise(resolve => cbapi(resolve)), promiseapi()]) 
.then(myTask) 
.catch(e => console.error(e)); 

myTask將包含來自兩個調用結果的數組被調用。

+0

您不應將'resolve'作爲回調。 – Louy

+0

這樣,如果'cbapi'導致錯誤,它仍然會解決承諾。它應該拒絕。 – Louy

+0

@Louy寫的,OP的'cbapi'沒有辦法異步失敗(返回之後),所以我的回答在給出這些約束的情況下是適當的。爲了能夠異步失敗,'cbapi'將需要兩個參數:一個成功回調和一個失敗回調,然後我們會用'new Promise((resolve,reject)=> cbapi(resolve,reject ))'。 – jib

2

由於@esaukuha建議,你應該promisify你的回調apis,然後使用它們。我的小npm module只爲此。

import fromCallback from 'promise-cb/from'; 
fromCallback(cb => cbapi(cb)) 
    .then(myTask) // ... chain 
+0

'cbapi'確實有一個參數。我的答案只傳遞一個參數(lambda函數)。 – Louy

+0

對,我的意思是'myTask'不帶任何參數,而你假設一個錯誤參數和一個結果參數。 – jib

+0

'myTask'雖然沒有參數。我只是在'cbapi'中創建了一個標準承諾,並在完成後調用'myTask'。 – Louy

相關問題