Node.js – 在另一个方法完全执行后调用一个方法

我有两个简单的方法:

function do(x,y){ if(x){ XHR1().success(); } if(y){ XHR2().success(); } } function done(){ return something; } 

现在我只想确保在do()完成时调用done() (** do()方法包含Mysql DB的asynchronous请求

我怎么能做到这一点?**

显然这不会把这样的方法按顺序排列:

 do(x=1,y=1); done(); //this can run also if do() has not finished yet 

所以我tryed:

 function do(x,y,_callback){ if(x){ XHR1().success(); } if(y){ XHR2().success(); } _callback(); } function done(){ return something; } do(x=1,y=1,done()); // this won't work the same cause callback is not dependent by XHR response 

这是我用于承诺https://github.com/tildeio/rsvp.js/#arrays-of-promises

我知道承诺,但我不能如何把它放在sintax

假设XHR()返回一个承诺,这就是你的代码应该看起来像那样:

 function do(x,y) { var requests = []; if (x) requests.push( XHR1() ); if (y) requests.push( XHR2() ); return RSVP.all(requests); } function done(){ return something; } do(1, 1).then(done); 

由于node.js本质上是asynchronous的,所以正常的命令控制stream程不再起作用。 你有几个选项,其中2个是使用最广泛的。

  1. callback。 您可以将第二个方法作为parameter passing给第一个方法。 然后在第一个任务完成后执行传递的callback。 这种方法的缺点通常被称为节点社区中的“callback地狱”。 如果方法不是2,而是更多,那么你必须越来越多地传递和嵌套callback,创build一个巨大的嵌套结构。

  2. 使用承诺。 有许多库实现了promise模式。 总之,promise允许你从每个方法返回一个Promise对象。 承诺是一个对象,将来会完成它的工作。 它可以让你调用它的方法,让它知道什么需要发生,一旦完成。 看看这篇文章的更多信息: 理解node.js中的承诺

asynchronous方法的stream行模式是。

 asyncFunc1(arguments, function(err, data){ if(err) throw err; // Do your stuff }); function asyncFunc1(arguments, callback) { asyncFunc2(arg, function(err, data) { if(err) return callback(err); // Do your stuff callback(null, result); }); } 

请参阅fs.readFile() ;

编辑

仍然使用callback,但不是特定的模式,你可以使用这样的东西:

 function do(x,y,_callback){ var count = 0; if(x){ count++; XHR1().success(checkDone); } if(y){ count++; XHR2().success(checkDone); } function checkDone(){ count--; if(!count) _callback(); } } function done(){ return something; } do(x=1,y=1,done()); 

计数器会跟踪您进行了多less次asynchronous调用,并在完成所有调用时调用_callback 。 但是你需要给XHR().success()方法添加一个callbackXHR().success()