2017-05-08 42 views
0

可能是问题的标题不恰当的,但我可以解释什么,我想在我的代码做如何等待node.js中所有回调的单个函数的结果?

//一个回调函数

connection_db.query(get_measure_query,function(err,user_data1){ 
     if(err){ 
      // throw err; 
      let response_data = status_codes.db_error_0001; 
      console.log(response_data); 
      res.end('error'); 
     }else { 

    } 

    }); 

//第二个回调函数

connection_db.query(get_measure_query,function(err,user_data2){ 
     if(err){ 
      // throw err; 
      let response_data = status_codes.db_error_0001; 
      console.log(response_data); 
      res.end(enc); 
     }else { 
     res.end('error'); 
    } 
    }); 

//第3回调功能

connection_db.query(get_measure_query,function(err,user_data3){ 
     if(err){ 
      // throw err; 
      let response_data = status_codes.db_error_0001; 
      console.log(response_data); 
      res.end('error'); 
     }else { 

    } 
    }); 

现在我需要所有数据user_data1,user_data2和user_data3。我怎样才能得到这个在一个单一的功能

function allData(){ 
// This should wait for all the callbacks and then execute 

} 

我希望我能够理解我的问题。请让我知道如果som eone不理解它 提前,感谢帮助家伙!

+1

使用的承诺! (还有2个要去......) – undefined

+0

我能看到你做的唯一方法就是像'1stCall(function(data1){2ndCall(function(data2))})'或者像@undefined所说的那样链接它们,改变它们承诺,然后你可以使用['Promise.all()'](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all) – George

+0

什么是' 'connection_db'''?你使用哪个数据库库? –

回答

0

// 1. use Promise Promise.all() 
 
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all 
 

 

 
// 2. or gruff 
 
function handleAll(data) { 
 
    if(!handleAll.all) { 
 
    handleAll.all = [] 
 
    } 
 
    handleAll.all.push(data) 
 
    if(handleAll.all.length >= 3) { 
 
    //do something with handleAll.all [data1, data2, data3 ..] 
 

 

 
    handleAll.all = null 
 
    } 
 
} 
 
// invoke it in all the callback function 
 
connection_db.query(get_measure_query,function(err,user_data1){ 
 
    if(err){ 
 
    // throw err; 
 
    let response_data = status_codes.db_error_0001; 
 
    console.log(response_data); 
 
    res.end('error'); 
 
    }else { 
 
    handleAll(user_data1) 
 
    } 
 
});

+0

请你用一个例子解释 –

+0

调用handleAll所有'1/2/3rd'回调函数 ''' connection_db.query(get_measure_query,功能(ERR,user_data1){ 如果(ERR){ //掷ERR; 让RESPONSE_DATA = status_codes.db_error_0001; 的console.log(RESPONSE_DATA); res.end( '错误'); }否则{ handleAll(user_data1) } }); ... ''' – shalles

+0

现在我做了我使用Promise方法。谢谢:) –

0

我做了粗略,但你可以使用回调以获取在allData功能的所有数据。我认为下面的内容应该适合你,而不适应更新版本的代码。

function runALL(allData) { 
 
    connection_db.query(get_measure_query, function(err, user_data1) { 
 
     if (err) { 
 
      // throw err; 
 
      let response_data = status_codes.db_error_0001; 
 
      console.log(response_data); 
 
      res.end('error'); 
 
     } 
 
     else { 
 
      connection_db.query(get_measure_query, function(err, user_data2) { 
 
       if (err) { 
 
        // throw err; 
 
        let response_data = status_codes.db_error_0001; 
 
        console.log(response_data); 
 
        res.end(enc); 
 
       } 
 
       else { 
 
        connection_db.query(get_measure_query, function(err, user_data3) { 
 
         if (err) { 
 
          // throw err; 
 
          let response_data = status_codes.db_error_0001; 
 
          console.log(response_data); 
 
          res.end('error'); 
 
         } 
 
         else { 
 
          allData(user_data1, user_data2, user_data3) 
 
         } 
 
        }); 
 
       } 
 
      }); 
 
     } 
 

 
    }); 
 
} 
 
    
 
function allData((user_data1, user_data2, user_data3) { 
 
    // use user_data1, user_data2, user_data3 
 
}) 
 
    
 
runAll(allData)

+0

但这可能导致回调地狱。我想避免这种情况 –

+0

如果你没有很多异步函数(或者将来不添加),那么我猜它很好。但是如果你不习惯使用回调,那么我会建议使用比回调更简洁的promise。我想这个链接很有帮助, https://developers.google.com/web/fundamentals/getting-started/primers/promises – Actung