Je hebt twee hoofdproblemen.
-
Uw
phoneNumber
variabele zal niet zijn wat je wilt dat het is. Dat kan worden opgelost door te veranderen in een.forEach()
of.map()
iteratie van uw array omdat dat een lokaal functiebereik voor de huidige variabele zal creëren. -
U hebt een manier gemaakt om te weten wanneer alle asynchrone bewerkingen zijn voltooid. Er zijn veel dubbele vragen/antwoorden die laten zien hoe dat moet. U wilt waarschijnlijk
Promise.all()
. gebruiken .
Ik stel deze oplossing voor die gebruik maakt van de beloften die je al hebt:
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
});
Dit is hoe dit werkt:
- Bel
contacts.filter(utils.isValidNumber)
om de array te filteren op alleen geldige getallen. - Bel
.map()
om door die gefilterde array te bladeren return db.client().get(phoneNumber)
van de.map()
terugbellen om een reeks beloften te maken.- Nadat u de gegevens voor het telefoonnummer heeft ontvangen, voegt u die gegevens toe aan uw aangepaste
contactList
object (dit is in wezen een neveneffect van de.map()
lus. - Gebruik
Promise.all()
op de geretourneerde reeks beloften om te weten wanneer ze allemaal klaar zijn. - Maak de
contactList
object dat we hebben opgebouwd, is de oploswaarde van de geretourneerde belofte. - Om het vervolgens aan te roepen, gebruik je gewoon de geretourneerde belofte met
.then()
om het eindresultaat te krijgen. U hoeft geen callback-argument toe te voegen als u al een belofte heeft dat u gewoon kunt terugkeren.