Waiting for multiple callbacks in Node.js

I have a Node.js application in which you can call several functions depending on several factors, but after the last callback, only one last function is called.

This is a simplified version of what I got:

if(foo === bar){ function1(arg1, function(val1){ doWhatever(val1, function(){ res.end("Finished"); }); }); }else if(foo === baz){ function2(arg2, function(val2){ doWhatever(val2, function(){ res.end("Finished"); }); }); }else{ function3(arg3, function(val3){ doWhatever(val3, function(){ res.end("Finished"); }); }); } 

And here is what I do:

 var finished = false; if(foo === bar){ function1(arg1, function(val1){ result = val1; finished = true; }); }else if(foo === baz){ function2(arg2, function(val2){ result = val2; finished = true; }); }else{ function3(arg3, function(val3){ result = val3; finished = true; }); } var id = setInterval(function(){ if(finished === true){ clearInterval(id); doWhatever(result, function(){ res.end("Finished"); }); } }, 100); 

I suppose this can be simplified using promises, however I'm not sure how to implement it.

+6
source share
3 answers

You can also do this with when and promises, which IMHO is easiest to read.

 var promises = []; if(x) { var deferred1 = when.defer(); doSomethingAsync({ callback: deferred1.resolve }); promises.push(deferred1.promise); } else if(y) { var deferred2 = when.defer(); doSomethingAsync({ callback: deferred2.resolve }); promises.push(deferred2.promise); } else if(z) { var deferred3 = when.defer(); doSomethingAsync({ callback: deferred3.resolve }); promises.push(deferred3.promise); } when.all(promises).then(function () { console.log('Finished Promises'); }); 
+7
source

Here is one way with asynchronous rows.

https://github.com/caolan/async#series

 async.series([ function(callback){ if(foo === bar){ function1(arg1, function(val1){ callback(null, val1); }); }else if(foo === baz){ function2(arg2, function(val2){ callback(null, val2); }); }else{ function3(arg3, function(val3){ callback(null, val3); }); } } ], function(error, valArray){ doWhatever(valArray[0], function(){ res.end("Finished"); }); }); 
+3
source

This uses wait.for

https://github.com/luciotato/waitfor

 //in a fiber var result; if(foo === bar){ result = wait.for(function1,arg1); }else if(foo === baz){ result = wait.for(function2,arg2); }else{ result = wait.for(function3,arg3); }; doWhatever(result, function(){ res.end("Finished"); }); 

You need to be in the fiber (or generator) to use wait.for, but if you have a lot of hell back, wait.for is a good approach.

+3
source

All Articles