-2

I want to write a find() query inside a for loop now i want my query to execute first then to increment i of the for loop can somebody please tell me how to do it. I have read many answers here but every one dels with parallel execution of queries but i want to call them serially as otherwise there will be no use of Sort operation here.

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"});
            }
        }
    });

1 Answers1

0

Use context binding inside for loop

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);                   
}
Medet Tleukabiluly
  • 11,662
  • 3
  • 34
  • 69
  • Whoever left the downvote - would be useful to know why you downvoted the answer – Medet Tleukabiluly Aug 24 '15 at 18:06
  • can you please tell me in detail what is happening here @evec by the way thanks for your answer. – Shivank Jain Aug 24 '15 at 18:17
  • Im 100% sure your `i` behaves unexpectedly, that's why you must use context binding, to make sure `i` is expected number, as you are using it inside mongoose callbacks. Without context binding, `i === docs.length` in any part inside for loop – Medet Tleukabiluly Aug 24 '15 at 18:20