Javascript 如何在nodejs中实现异步功能

Javascript 如何在nodejs中实现异步功能,javascript,node.js,asynchronous,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 '

让我解释一下我的问题。我有一个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的异步特性。但是我们如何在异步中实现这个函数呢


任何想法都是值得欣赏的

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

functionPerformingQuery(function(result){
    handleResult(result);
});
主要思想是:

  • 创建一个接受回调函数的函数
  • 操作完成后调用回调函数
  • 在代码中定义回调函数以访问所有私有变量
更标准化的方法是promise()


在foreach循环中,不需要返回。试试看:

var resultArray=[];
面板.forEach(功能(面板,索引){
开关(panel.CategoryId){
案例“数学”:
resultaray=resultArray.concat(SOMEVALUE来自DB);
打破
“物理学”案例:
resultaray=resultArray.concat(SOMEVALUE来自DB);
打破
“动物学”案例:
resultaray=resultArray.concat(SOMEVALUE来自DB);
打破
}
})

console.log(resultArray)

在我看来,因为db上的请求是异步的,所以需要使用承诺来执行结果


查询是在切换条件之前还是之后执行?@MatteoRubini查询是在案例条件内部执行的
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()
}