微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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])},res){
          tArr[i]  = res;       
          console.log(res);                     
        });                       
      }
      console.log(tArr);
    }               
    return response.send(result); 
  }
});

它不是在node.js中按顺序执行的,所以我在执行结束时得到一个空数组.问题是它会先执行console.log(tArr);然后执行

common.findOne('tasks',res){
      tArr[i]  = res;       
      console.log(res);                                         
});

我的代码或其他任何方式都有任何错误.
谢谢!

解决方法

您可能已经意识到,事情在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)},res) {
      tArr.push(res); // NOTE: Assuming order does not matter here
      console.log(res);
      callback(err);
    });
  }

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

这里要看的主要内容是processEachTask与每个任务并行调用,因此无法保证顺序.要标记任务已处理,您将在findOne的匿名函数调用回调.这允许您在processEachTask中执行更多异步工作,但仍然设法表示何时完成.当每个任务完成后,它将调用afterallTask​​s.

看一下async,看看它提供的所有辅助函数,它非常有用!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐