Du har to hovedproblemer.
-
Dit
phoneNumber
variabel vil ikke være, hvad du ønsker, den skal være. Det kan rettes ved at ændre til en.forEach()
eller.map()
iteration af dit array, fordi det vil skabe et lokalt funktionsområde for den aktuelle variabel. -
Du har oprettet en måde at vide, hvornår alle asynkroniseringshandlinger er udført. Der er masser af dobbelte spørgsmål/svar, der viser, hvordan man gør det. Du vil sandsynligvis bruge
Promise.all()
.
Jeg vil foreslå denne løsning, der udnytter de løfter, du allerede har:
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
});
Sådan fungerer det:
- Ring til
contacts.filter(utils.isValidNumber)
for at filtrere arrayet til kun gyldige tal. - Ring til
.map()
at iterere gennem det filtrerede array return db.client().get(phoneNumber)
fra.map()
tilbagekald for at skabe en række løfter.- Når du har fået dataene for telefonnummeret, skal du tilføje disse data til din tilpassede
contactList
objekt (dette er i det væsentlige en bivirkning af.map()
sløjfe. - Brug
Promise.all()
på den returnerede række af løfter om at vide, hvornår de alle er færdige. - Lav
contactList
objekt, vi har opbygget, være værdien af det returnerede løfte. - For derefter at kalde det, skal du blot bruge det returnerede løfte med
.then()
for at få det endelige resultat. Ingen grund til at tilføje et tilbagekaldsargument, når du allerede har et løfte om, at du bare kan vende tilbage.