Hai due problemi principali.
-
Il tuo
phoneNumber
variabile non sarà quello che vuoi che sia. Questo può essere risolto cambiando in un.forEach()
o.map()
iterazione dell'array perché ciò creerà un ambito di funzione locale per la variabile corrente. -
Hai creato un modo per sapere quando tutte le operazioni asincrone sono state eseguite. Ci sono molte domande/risposte duplicate che mostrano come farlo. Probabilmente vorrai usare
Promise.all()
.
Suggerirei questa soluzione che fa leva sulle promesse che hai già:
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
});
Ecco come funziona:
- Chiama
contacts.filter(utils.isValidNumber)
per filtrare l'array solo su numeri validi. - Chiama
.map()
per scorrere l'array filtrato return db.client().get(phoneNumber)
dal.map()
richiamata per creare una serie di promesse.- Dopo aver ottenuto i dati per il numero di telefono, aggiungi tali dati alla tua
contactList
personalizzata oggetto (questo è essenzialmente un effetto collaterale di.map()
ciclo. - Usa
Promise.all()
sulla matrice restituita di promesse per sapere quando sono tutte completate. - Crea la
contactList
l'oggetto che abbiamo costruito sia il valore di risoluzione della promessa restituita. - Quindi, per chiamarlo basta usare la promessa restituita con
.then()
per ottenere il risultato finale. Non c'è bisogno di aggiungere un argomento di callback quando hai già una promessa che puoi semplicemente restituire.