如何在nodejs中实现异步函数

How can implement the function as asynchronous in nodejs

本文关键字:实现 异步 函数 nodejs      更新时间:2023-09-26

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

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);
});

主要思想是:

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

有望采用更标准化的方法

https://www.promisejs.org/

在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);

在我看来,由于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()
}