一尘不染

在node.js中顺序执行

node.js

我有类似的代码

common.findOne('list', {'listId': parseInt(request.params. istId)}, function(err, result){       
  if(err) {
    console.log(err);
  }
  else {
    var tArr = new Array();               
    if(result.tasks) {
      var tasks = result.tasks;
      for(var i in tasks) {
        console.log(tasks[i]);
        common.findOne('tasks', {'taskId':parseInt(tasks[i])}, function(err,res){
          tArr[i]  = res;       
          console.log(res);                     
        });                       
      }
      console.log(tArr);
    }               
    return response.send(result); 
  }
});

它没有在node.js中按顺序执行,因此在执行结束时得到一个空数组。问题是它将先执行console.log(tArr);然后执行

common.findOne('tasks',{'taskId':parseInt(tasks[i])},function(err,res){
      tArr[i]  = res;       
      console.log(res);                                         
});

我的代码中是否有任何错误或执行此操作的任何其他方式?谢谢!


阅读 359

收藏
2020-07-07

共1个答案

一尘不染

您可能已经知道,事情在node.js中异步运行。因此,当您需要使事物按特定顺序运行时,您需要利用控件库或基本上自己实现。

我强烈建议您看一下async,因为它可以轻松地使您执行以下操作:

var async = require('async');

// ..

if(result.tasks) {
  async.forEach(result.tasks, processEachTask, afterAllTasks);

  function processEachTask(task, callback) {
    console.log(task);
    common.findOne('tasks', {'taskId':parseInt(task)}, function(err,res) {
      tArr.push(res); // NOTE: Assuming order does not matter here
      console.log(res);
      callback(err);
    });
  }

  function afterAllTasks(err) {
    console.log(tArr);
  }
}

在这里看到的主要内容是,每个任务并行调用了processEachTask,因此不能保证顺序。要标记任务已处理,您将从中调用callback匿名函数findOne。这使您可以进行更多的异步工作,processEachTask但仍然可以表示何时完成。完成所有任务后,它将调用afterAllTasks

看一看异步,看看它提供的所有辅助功能,这非常有用!

2020-07-07