在继续之前等待callback函数完成

function main(cb) { getFirstData(function(ResultsForFirstQuery) { // Do something with ResultsForFirstQuery // Call getSecondData with param Id I get from ResultsForFirstQuery() getSecondData(function(ResultsForFirstQuery[0].Id)) { // Now here I need to do something with data data I get from getSeconData(), // But the program only calls this AFTER cb(result) in MAIN because of async? // How to make the program to wait for this function to finish? }); }); // THIS GETS CALLED BEFORE getSeconData() is finished // but I need to modify data i get from getSeconData before // calling this. cb(result); } funtion getFirstData(cb) { var rows; var sql = "sql magic here" /* Make Sql-query here and return results as rows in cb */ cb(rows); } funtion getSecondData(id, cb) { var rows; var sql = "sql magic here" /* Make Sql-query here and return its results as rows in cb */ cb(rows); } 

我试图评论这些代码,以便SO读者能够更好地理解这个问题。 函数main(cb)从另一个文件中被调用,我使用它的callback来发送邮件,但是我把它从代码中删除,因为我认为它不相关。 我也遗漏了代码块中的函数的作用,因为我认为它不相关,但是如果有人感兴趣,他们将从多个数据库表中生成一个XML文件。 这也是一个node.js应用程序。

我遇到的问题是,当我调用getFirstData()和getSecondData()并获取结果时,getSeconData()在getFirstData()结束并且生成这两个函数的结果之前不会执行。 我如何修改这个程序,让它在继续之前等待getSeconData()完成?

如注释中所述,您需要在第二个函数的callback中调用cb(result)

 function main(cb) { getFirstData(function(ResultsForFirstQuery) { getSecondData(ResultsForFirstQuery[0].Id, function(ResultsForSecondQuery) { // compute away... cb(result); }); }); } 

一个好方法是通过Promise。

 var a = getFirstData(cb) { return new Promise( function( resolve, reject ){ // your code here resolve( some data ); }); } var b = getSecondData(id, cb) { return new Promise( function( resolve, reject ){ // your code here resolve( some data ); }); } Promise.all( a, b).then(function(){ // once both promises resolve, continue });