2

I have the following code:

    async.each(arrayUser, function (user, callback) { //loop through array
      console.log('1');
      async.each(user.parentOf, function (child, callback1) { //loop through array
        console.log(2);
        models.Students.find({
            '_id': child._id
          },
          function (err, foundStudent) {
            console.log('3');
            callback1();
          },
          function (err) {
            console.log("InnerLoopFinished");
            callback();
          });
      }, function (err) {
        console.log("OuterLoopFinished");
        console.log('Process Finished');
      });
    });

The arrayUser is created like this:

    var arrayUser = [];
    users.forEach(function (user) {
      var arrayUser1 = {
        parent: {
          _id: user._id,
          firstName: user.firstName,
          lastName: user.lastName
        },
        userRoleID: user.userRoleID.length,
        parentOf: user.parentOf

      };
      arrayUser.push(arrayUser1);
    });

and a sample of user.parentOf is:

    user.parentOf = [{
        studentLastName: 'Flores',
        studentFirstName: 'Aedan',
        studentID: 111444,
        _id: 5a596979ea2d7a360c75948c
      },
      {
        studentLastName: 'Moses',
        studentFirstName: 'Chase',
        studentID: 111756,
        _id: 5a596979ea2d7a360c759489
      }
    ]

My issue is that even with the async.each The function is still not running correctly. It seems to be hitting a wall when it gets to the models.Students.find function and it runs the next callback.

I need to run the InnerLoop completely before moving on to the next user. I followed the correct answer at nodejs Async.each Nested loop Confusion but with no results. I have tried changing the models.Students.find function to findOneAndUpdate and I got the same result.

I think I need to add that I need to find multiple users with an inner array in each. If I had only one user (without the outer loop) it works fine.

my console.log is: 1, 2, 1, 2, 1, 2 ... 3, 3, 3...

and I need it to be 1, 2, 3, 1, 2, 3.

1 Answer 1

6

we need to use async.eachSeries() instead of async.each(). This is the working snippet as per your expectation 1, 2, 3, 1, 2, 3.

async.eachSeries(arrayUser, function (user, callback) { //loop through array
      console.log('1');
      async.eachSeries(user.parentOf, function (child, callback1) { //loop through array
        console.log(2);
        models.Students.find({
            '_id': child._id
          },
          function (err, foundStudent) {
            console.log('3');
            callback1();
          });
      },function (err) {
        console.log("InnerLoopFinished");
        callback();
      });
    }, function (err) {
        console.log("OuterLoopFinished");
        console.log('Process Finished');
      });
    });

this is because the eachSeries function executes in iteratee function in order (after completion of the previous iteration and waits till callback() is called) so it gives output as per your expectation

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.