我的代码就像
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中执行更多异步工作,但仍然设法表示何时完成.当每个任务完成后,它将调用afterallTasks.