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