2016-02-20 71 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

相关问题