Masz dwa główne problemy.
-
Twój
phoneNumber
zmienna 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
contactList
obiekt (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
contactList
obiekt, 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ć.