2012-03-15 7 views
5

wyboru poniżej algorytmu ...zagnieżdżone pętle asynchronicznie w nodejs, obok pętli należy rozpocząć dopiero po jeden dostaje zakończone

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; 

Chcę rozwijać taką samą logikę korzystania node.js.

Próbowałem, używając async z foreach i concat i foreachseries funkcji. Ale wszystko zawiedzie na drugim poziomie.

Podczas gdy wskaźnik otrzymuje kontakty jednego użytkownika, wzrasta wartość i, a proces rozpoczyna się dla kolejnych użytkowników. Nie czeka na proces nawiązywania połączeń z telefonami & w celu ukończenia dla jednego użytkownika. i dopiero po uruchomieniu następnego użytkownika. Chcę to osiągnąć.

Właściwie chcę uzyskać użytkownicy obiektów z odpowiednimi

oznaczają wszelkie sekwencje zrujnowanych zaczyna, może ktoś mi dać ogólne pojęcie w jaki sposób można osiągnąć taki proces serii. Jestem też otwarty na zmianę mojego algorytmu.

Odpowiedz

11

W węźle.js trzeba użyć asynchronicznego sposobu. Twój kod powinien wyglądać następująco:

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

Dzięki bro! działa dokładnie zgodnie z oczekiwaniami ... –

+0

Po prostu kilka zmian, edycja tych zmian –

Powiązane problemy