Você tem dois problemas principais.
-
SeuphoneNumber
variável não será o que você quer que seja. Isso pode ser corrigido mudando para um.forEach()
ou.map()
iteração de sua matriz porque isso criará um escopo de função local para a variável atual.
-
Você criou uma maneira de saber quando todas as operações assíncronas são feitas. Há muitas perguntas/respostas duplicadas que mostram como fazer isso. Você provavelmente quer usarPromise.all()
.
Eu sugiro esta solução que aproveita as promessas que você já tem:
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
});
Veja como isso funciona:
- Chame
contacts.filter(utils.isValidNumber)
para filtrar a matriz apenas para números válidos. - Chame
.map()
para iterar por esse array filtrado return db.client().get(phoneNumber)
do.map()
callback para criar uma matriz de promessas.- Depois de obter os dados do número de telefone, adicione esses dados à sua
contactList
personalizada objeto (este é essencialmente um efeito colateral do.map()
laço. - Use
Promise.all()
na matriz retornada de promessas para saber quando todas elas foram concluídas. - Faça a
contactList
objeto que construímos seja o valor de resolução da promessa retornada. - Então, para chamá-lo, basta usar a promessa retornada com
.then()
para obter o resultado final. Não há necessidade de adicionar um argumento de retorno de chamada quando você já tem uma promessa que pode apenas retornar.