Javascript 如何在node.js中编写for循环,以便每个任务都可以串行执行
我想在for循环中写一个find()查询,现在我想先执行查询,然后再增加for循环的I,有人能告诉我怎么做吗。我在这里读了很多答案,但是每一个都是并行执行查询的del,但是我想串行调用它们,否则这里就没有排序操作了Javascript 如何在node.js中编写for循环,以便每个任务都可以串行执行,javascript,node.js,for-loop,asynchronous,Javascript,Node.js,For Loop,Asynchronous,我想在for循环中写一个find()查询,现在我想先执行查询,然后再增加for循环的I,有人能告诉我怎么做吗。我在这里读了很多答案,但是每一个都是并行执行查询的del,但是我想串行调用它们,否则这里就没有排序操作了 merchantmodel.find({merchant_id: merchant_id}, {'review':1, '_id':0, 'rating':1, 'anonymous': 1, 'user_id': 1}, {sort: {time_at: -1}, limit :
merchantmodel.find({merchant_id: merchant_id}, {'review':1, '_id':0, 'rating':1, 'anonymous': 1, 'user_id': 1}, {sort: {time_at: -1}, limit : 3}, function(err, docs) {
if (err) {
console.log('Error Finding query results');
console.log(err);
res.json({success: 0, message : err});
return next(err);
} else {
if (docs) {
//
res.write('{');
res.write('\n');
res.write("\"success\": 1, \n")
res.write("\"message\": \"Successfully Fetched the Reviews\", \n")
res.write("\"reviews\": [");
res.write('\n');
for(var i = 0; i < docs.length; i++){
console.log('i: ', i);
if (docs[i].anonymous == 1) {
console.log('Anonymous');
res.write(JSON.stringify({review: docs[i].review, rating : docs[i].rating, user_name : "Anonymous"}));
// res.json({review: docs[i].review, rating : docs[i].rating, user_name : "Anonymous"});
} else {
var user_idd = docs[i].user_id;
var revieww = docs[i].review;
var ratingg = docs[i].rating;
console.log('user_id : ', user_idd);
console.log('review : ', revieww);
console.log('rating : ', ratingg);
usermodel.findOne({jeb_no: user_idd }, {'user_name':1, '_id':0}, function(err, docss) {
if (err) {
console.log('Error Finding query results');
console.log(err);
res.write(JSON.stringify({review: revieww, rating : ratingg, user_name : "Anonymous"}));
// res.json({review: revieww, rating : ratingg, user_name : "Anonymous"});
return next(err);
} else {
if (docss) {
console.log('Username : ', docss.user_name);
res.write(JSON.stringify({review: revieww, rating : ratingg, user_name : docss.user_name}));
// res.json({review: revieww, rating : ratingg, user_name : docss[i].user_name});
} else {
console.log('No Username');
res.write(JSON.stringify({review: revieww, rating : ratingg, user_name : "Anonymous"}));
// res.json({review: revieww, rating : ratingg, user_name : "Anonymous"});
}
}
});
}
if (i < docs.length - 1) {
res.write(',');
}
}
res.write('\n');
res.write(']');
res.write('\n');
res.write('}');
res.end();
} else {
console.log('No Reviews');
res.json({success: -1, message : "No Reviews"});
}
}
});
merchantmodel.find({merchant\u id:merchant\u id},{'review':1,'u id':0,'rating':1,'anonymous':1,'user\u id':1},{sort:{time\u at:-1},limit:3},函数(err,docs){
如果(错误){
log('Error Finding query results');
控制台日志(err);
res.json({success:0,message:err});
返回下一个(错误);
}否则{
如果(文档){
//
res.write('{');
res.write('\n');
res.write(“成功”:1,\n)
res.write(“\”消息\“:\”已成功获取评论\“,\n”)
res.write(“\”评论\“:[”);
res.write('\n');
对于(变量i=0;i
在for循环中使用上下文绑定
for(var i = 0; i < docs.length; i++){
(function(i){ //add this function call, don't forget ending parenthesis
//execution context, i is safe here
}(i);
}
for(变量i=0;i
以下是一些很好的答案,我个人使用的是async
(第二个最佳答案)你可以使用asyn.eachSeries
来循环运行一系列的每项任务。不管是谁离开了否决票,知道你为什么否决了答案都会很有用。顺便问一下,你能详细告诉我@evec这里发生了什么吗?谢谢你的回答。我100%确定你的i
行为出人意料,这就是你必须使用上下文bi的原因nding,以确保i
是预期的数字,因为您在mongoose回调中使用它。在没有上下文绑定的情况下,i===docs.length
在for循环中的任何部分