如何在nodejs中将该函数实现为异步

时间:2015-03-03 09:47:07

标签: javascript node.js asynchronous

让我解释一下我的问题。我有一个foreach循环和一个切换条件。在每个开关的情况下,我都将结果连接到一个全局数组。

var resultArray = [];
Panels.forEach(function (panel, index) {
 switch( panel.CategoryId ){
   case 'math': 
      resultArray = resultArray.concat(SOMEVALUE COMES FROM DB);
   break;
   case 'physics': 
      resultArray = resultArray.concat(SOMEVALUE COMES FROM DB);
   break;
   case 'zoology': 
      resultArray = resultArray.concat(SOMEVALUE COMES FROM DB);
   break;
 }

 return resultArray;
})

但是输出并不包含所有情况下的值。我知道它是因为nodejs的异步性质。但是我们如何将这个函数实现为异步?

任何想法都会很明显

3 个答案:

答案 0 :(得分:0)

要创建类似的同步程序流程,您必须在设计中使用回调模式:

functionPerformingQuery(function(result){
    handleResult(result);
});

主要观点是:

  
      
  • 创建一个接受回调函数的函数
  •   
  • 在操作完成时调用回调函数
  •   
  • 在代码中定义回调函数以访问所有私有变量
  •   

更标准化的方法是承诺()

https://www.promisejs.org/

答案 1 :(得分:0)

在foreach循环中,没有必要作为回报。试试吧:      var resultArray = []; Panels.forEach(function (panel, index) { switch( panel.CategoryId ){ case 'math': resultArray = resultArray.concat(SOMEVALUE COMES FROM DB); break; case 'physics': resultArray = resultArray.concat(SOMEVALUE COMES FROM DB); break; case 'zoology': resultArray = resultArray.concat(SOMEVALUE COMES FROM DB); break; } }) console.log(resultArray);

答案 2 :(得分:0)

在我看来,因为db上的请求是异步的,你需要使用promise Jquery Promise执行结果

var resultArray = [];
Panels.forEach(function (panel, index) {
 switch( panel.CategoryId ){
   case 'math': 
      myDBfunction().then(function(result) {
         resultArray = resultArray.concat(result);
      });
   break;
   case 'physics': 
      myDBfunction().then(function(result) {
         resultArray = resultArray.concat(result);
      });
   break;
   case 'zoology': 
      myDBfunction().then(function(result) {
         resultArray = resultArray.concat(result);
      });
   break;
 }

 return resultArray;
})

function myDBfunction() {

    var deferred = new jQuery.Deferred();

    // do some with DB (not real code)
    mysql.query("SELECT * ....", function(dbError, dbResult) {
      deferred.resolve(dbResult);
    })

  return deferred.promise()
}