Tienes dos problemas principales.
-
Su
phoneNumber
variable no será lo que usted quiere que sea. Eso se puede arreglar cambiando a.forEach()
o.map()
iteración de su matriz porque eso creará un alcance de función local para la variable actual. -
Ha creado una forma de saber cuándo se realizan todas las operaciones asíncronas. Hay muchas preguntas/respuestas duplicadas que muestran cómo hacerlo. Probablemente quieras usar
Promise.all()
.
Sugeriría esta solución que aprovecha las promesas que ya tiene:
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
});
Así es como funciona esto:
- Llamar a
contacts.filter(utils.isValidNumber)
para filtrar la matriz a solo números válidos. - Llamar a
.map()
para iterar a través de esa matriz filtrada return db.client().get(phoneNumber)
desde el.map()
devolución de llamada para crear una serie de promesas.- Después de obtener los datos del número de teléfono, agréguelos a su
contactList
personalizado. objeto (esto es esencialmente un efecto secundario del.map()
bucle. - Utilice
Promise.all()
en el conjunto de promesas devuelto para saber cuándo se completaron todas. - Haga la
contactList
el objeto que construimos sea el valor de resolución de la promesa devuelta. - Luego, para llamarlo simplemente use la promesa devuelta con
.then()
para obtener el resultado final. No es necesario agregar un argumento de devolución de llamada cuando ya tiene una promesa de que puede regresar.