Вложенные циклы асинхронно в Node.js, следующий цикл должен начинаться только после его завершения - PullRequest
5 голосов
/ 15 марта 2012

Проверьте ниже алгоритм ...

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;

Я хочу разработать такую ​​же логику, используя node.js.

Я пытался использовать async с функциями foreach и concat и foreachseries. Но все терпят неудачу на втором уровне.

Когда указатель получает контакты одного пользователя, значение i увеличивается, и процесс начинается для следующих пользователей. Не требуется, чтобы процесс получения контактов и телефонов завершился для одного пользователя. и только после этого запускается следующий пользователь. Я хочу добиться этого.

На самом деле, я хочу, чтобы пользователи возражали с правильным

Означает, что все последовательности разрушаются, кто-нибудь может дать мне общее представление о том, как я могу добиться такого последовательного процесса. Я тоже готов изменить свой алгоритм.

Ответы [ 3 ]

12 голосов
/ 15 марта 2012

В node.js вам нужно использовать асинхронный способ. Ваш код должен выглядеть примерно так:

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
});
0 голосов
/ 21 мая 2019

Вы можете попробовать этот метод без использования 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);
   })
})
0 голосов
/ 18 июня 2018

// Асинхронный вложенный цикл

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');
});
...