Search code examples
node.jsmongoosekoa

How can I write sequential execution in foreach loop of nodejs?


I am new to nodejs. please help me how to save the data in foreach loop and send response back to controller.it returns false not return object. Thanks in advance

Here is my code like

var rideStatus = require('../models/ridestatus');
module.exports = {
  invite_ride: function* (body) {
    var saved = false;
    var receivers = body.uids;
    receivers = receivers.split(',').filter(function(n) { return n != 'null'; });
    receivers.forEach(function* (n) {
      yield rideStatus.findOne(
        {$and: [{ride_id: body.rideid}, {receiver_id: receivers}]},
        function(err, doc) {
          if (doc === null) {
            new rideStatus({
              ride_id: body.rideid,
              invited_id: body.userId,
              receiver_id: receivers,
            }).save(function(err1, ridestatus) {
              if (!err1) {
                rideStatus.findOne({_id: ridestatus._id}).
                  populate('ride_id').
                  populate('invited_id').
                  populate('receiver_id').
                  exec(function(err2, user) {
                    // console.log(user);
                    if (user != null) {
                      saved = user;

                    }
                  });
              }
            });
          }
        });
    });
    return saved;
  },
};

Solution

  • because of the asynchronous nature of node.js your "return save" statement won't wait for your i/o to complete his work. and also note that if you have multiple values to be saved, you should return an array of saved Users objects.

    var rideStatus = require('../models/ridestatus');
    module.exports = {
        invite_ride: function* (body) {
            var savedUsers = [];
            var receivers = body.uids;
            receivers = receivers.split(',').filter(function(n) { return n != 'null'; });
            var len = receivers.length
            var i=0
            receivers.forEach(function* (n) {
                yield rideStatus.findOne(
                    {$and: [{ride_id: body.rideid}, {receiver_id: receivers}]},
                    function(err, doc) {
                        if (doc === null) {
                            new rideStatus({
                                ride_id: body.rideid,
                                invited_id: body.userId,
                                receiver_id: receivers,
                            }).save(function(err1, ridestatus) {
                                if (!err1) {
                                    rideStatus.findOne({_id: ridestatus._id}).
                                        populate('ride_id').
                                        populate('invited_id').
                                        populate('receiver_id').
                                        exec(function(err2, user) {
                                            // console.log(user);
                                            if (user != null) {
                                                savedUsers.push(user);
                                            }
                                            if(i==len-1)
                                                return savedUsers;
                                            else
                                                i++
                                        });
                                }else{
                                    i++
                                }
                            });
                        }else{
                            i++
                        }
                });
            });
        },
    };