7

Check below algorithm...

users = getAllUsers();
for(i=0;i<users.length;i++)
{
    contacts = getContactsOfUser(users[i].userId);
    contactslength = contacts.length;
    for(j=o;j<contactsLength;j++)
    {
         phones = getPhonesOfContacts(contacts[j].contactId);
         contacts[j].phones = phones;
    }
    users[i].contacts = contacts;
}

return users;

I want to develop such same logic using node.js.

I have tried using async with foreach and concat and foreachseries functions. But all fail in the second level.

While pointer is getting contacts of one user, a value of i increases and the process is getting started for next users. It is not waiting for the process of getting contacts & phones to complete for one user. and only after that starting the next user. I want to achieve this.

Actually, I want to get the users to object with proper

Means all the sequences are getting ruined, can anyone give me general idea how can I achieve such a series process. I am open to change my algorithm also.

3 Answers 3

14

In node.js you need to use asynchronous way. Your code should look something like:

var processUsesrs = function(callback) {
    getAllUsers(function(err, users) {
        async.forEach(users, function(user, callback) {
            getContactsOfUser(users.userId, function(err, contacts) {
                async.forEach(contacts, function(contact, callback) {
                    getPhonesOfContacts(contacts.contactId, function(err, phones) {
                        contact.phones = phones;
                        callback();
                    });
                }, function(err) {
                    // All contacts are processed
                    user.contacts = contacts;
                    callback();
                });
            });
        }, function(err) {
            // All users are processed
            // Here the finished result
            callback(undefined, users);
        });
    });
};

processUsers(function(err, users) {
    // users here
});
Sign up to request clarification or add additional context in comments.

Comments

1

You could try this method without using async:

function getAllUserContacts(users, callback){
   var index = 0;
   var results = [];
   var getUserContacts = function(){
      getContactsOfUser(users[index].userId, function(contacts){
        var index2 = 0;
        var getContactsPhones = function(){
          getPhonesOfContacts(contacts[index2].contactId, function(phones){
            contacts[index2].phones = phones;
            if(index2 === (contacts.length - 1)){
              users[index].contacts = contacts;
              if(index === (users.length - 1)){
                callback(users)
              } else {
                index++;
                getUserContacts();
              }
            }else{
              index2++;
              getContactsPhones();
            }
          });
         }
         getContactsPhones();
      });
   }
   getUserContacts();
}

//calling the function
getAllUsers(function(users){
   getAllUsersWithTheirContacts(users, function(usersWithContacts){
      console.log(usersWithContacts);
   })
})

Comments

0

//Asynchronous nested loop

async.eachSeries(allContact,function(item, cb){
  async.eachSeries(item,function(secondItem,secondCb){
     console.log(secondItem);
     return secondCb();
  }
  return cb();
},function(){
    console.log('after all process message');
});

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.