Masz dwa główne problemy.
-
Twój
phoneNumberzmienna nie będzie taka, jak chcesz. Można to naprawić, zmieniając na.forEach()lub.map()iterację tablicy, ponieważ utworzy to lokalny zakres funkcji dla bieżącej zmiennej. -
Stworzyłeś sposób, aby wiedzieć, kiedy wszystkie operacje asynchroniczne są wykonane. Istnieje wiele zduplikowanych pytań/odpowiedzi, które pokazują, jak to zrobić. Prawdopodobnie chcesz użyć
Promise.all().
Proponuję to rozwiązanie, które wykorzystuje obietnice, które już masz:
Funkcjafunction getContactList(contacts) {
var contactList = {};
return Promise.all(contacts.filter(utils.isValidNumber).map(function(phoneNumber) {
return db.client().get(phoneNumber).then(function(reply) {
// build custom object
constactList[phoneNumber] = reply;
});
})).then(function() {
// make contactList be the resolve value
return contactList;
});
}
getContactList.then(function(contactList) {
// use the contactList here
}, funtion(err) {
// process errors here
});
Oto jak to działa:
- Zadzwoń do
contacts.filter(utils.isValidNumber)aby filtrować tablicę tylko do prawidłowych liczb. - Wywołaj
.map()iterować przez tę przefiltrowaną tablicę return db.client().get(phoneNumber)z.map()wywołanie zwrotne, aby utworzyć tablicę obietnic.- Po uzyskaniu danych numeru telefonu dodaj je do niestandardowej
contactListobiekt (jest to zasadniczo efekt uboczny.map()pętla. - Użyj
Promise.all()na zwróconej tablicy obietnic, aby wiedzieć, kiedy wszystkie zostaną wykonane. - Utwórz
contactListobiekt, który zbudowaliśmy, będzie wartością rozwiązania zwróconej obietnicy. - Następnie, aby to wywołać, użyj zwróconej obietnicy z
.then()aby uzyskać ostateczny wynik. Nie ma potrzeby dodawania argumentu wywołania zwrotnego, gdy masz już obietnicę, że możesz po prostu zwrócić.