Vous avez deux problèmes principaux.
-
Votre
phoneNumber
variable ne sera pas ce que vous voudriez qu'elle soit. Cela peut être corrigé en passant à un.forEach()
ou.map()
itération de votre tableau car cela créera une portée de fonction locale pour la variable actuelle. -
Vous avez créé un moyen de savoir quand toutes les opérations asynchrones sont terminées. Il y a beaucoup de questions/réponses en double qui montrent comment faire cela. Vous voulez probablement utiliser
Promise.all()
.
Je suggérerais cette solution qui tire parti des promesses que vous avez déjà :
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
});
Voici comment cela fonctionne :
- Appelez
contacts.filter(utils.isValidNumber)
pour filtrer le tableau uniquement des nombres valides. - Appelez
.map()
pour parcourir ce tableau filtré return db.client().get(phoneNumber)
depuis le.map()
rappel pour créer un tableau de promesses.- Après avoir obtenu les données du numéro de téléphone, ajoutez ces données à votre
contactList
personnalisée objet (c'est essentiellement un effet secondaire du.map()
boucle. - Utilisez
Promise.all()
sur le tableau de promesses renvoyé pour savoir quand elles sont toutes terminées. - Créer la
contactList
l'objet que nous avons construit soit la valeur de résolution de la promesse retournée. - Ensuite, pour l'appeler, utilisez simplement la promesse renvoyée avec
.then()
pour obtenir le résultat final. Pas besoin d'ajouter un argument de rappel lorsque vous avez déjà une promesse que vous pouvez simplement retourner.