Sie haben zwei Hauptprobleme.
-
Ihre
phoneNumberVariable wird nicht das sein, was Sie wollen. Das kann behoben werden, indem man zu.forEach()wechselt oder.map()Iteration Ihres Arrays, da dies einen lokalen Funktionsbereich für die aktuelle Variable erstellt. -
Sie haben eine Möglichkeit geschaffen, um zu wissen, wann alle asynchronen Vorgänge abgeschlossen sind. Es gibt viele doppelte Fragen / Antworten, die zeigen, wie das geht. Wahrscheinlich möchten Sie
Promise.all()verwenden .
Ich würde diese Lösung vorschlagen, die die Versprechungen nutzt, die Sie bereits haben:
function 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
});
So funktioniert das:
- Rufen Sie
contacts.filter(utils.isValidNumber)auf um das Array nur nach gültigen Zahlen zu filtern. - Rufen Sie
.map()auf um durch dieses gefilterte Array zu iterieren return db.client().get(phoneNumber)aus der.map()Callback, um ein Array von Promises zu erstellen.- Nachdem Sie die Daten für die Telefonnummer erhalten haben, fügen Sie diese Daten Ihrer benutzerdefinierten
contactListhinzu Objekt (dies ist im Wesentlichen ein Nebeneffekt von.map()Schleife. - Verwenden Sie
Promise.all()auf dem zurückgegebenen Array von Versprechen, um zu wissen, wann sie alle fertig sind. - Erstellen Sie die
contactListObjekt, das wir aufgebaut haben, der Auflösungswert des zurückgegebenen Versprechens sein. - Um es dann aufzurufen, verwenden Sie einfach das zurückgegebene Promise mit
.then()um das Endergebnis zu erhalten. Es ist nicht erforderlich, ein Callback-Argument hinzuzufügen, wenn Sie bereits eine Zusage haben, dass Sie einfach zurückkehren können.