Máte dva hlavní problémy.
-
Vaše
phoneNumber
proměnná nebude taková, jakou chcete. To lze opravit změnou na.forEach()
nebo.map()
iteraci vašeho pole, protože to vytvoří rozsah lokální funkce pro aktuální proměnnou. -
Vytvořili jste způsob, jak zjistit, kdy jsou všechny asynchronní operace hotové. Existuje mnoho duplicitních otázek/odpovědí, které ukazují, jak na to. Pravděpodobně budete chtít použít
Promise.all()
.
Navrhoval bych toto řešení, které využívá sliby, které již máte:
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
});
Funguje to takto:
- Zavolejte
contacts.filter(utils.isValidNumber)
filtrovat pole pouze na platná čísla. - Zavolejte
.map()
iterovat přes toto filtrované pole return db.client().get(phoneNumber)
z.map()
zpětné volání k vytvoření řady slibů.- Po získání dat pro telefonní číslo přidejte tato data do svého vlastního
contactList
objekt (toto je v podstatě vedlejší efekt.map()
smyčka. - Použijte
Promise.all()
na vrácené řadě slibů, abyste věděli, kdy budou všechny hotové. - Vytvořte
contactList
objekt, který jsme vytvořili, bude rozhodovací hodnotou vráceného slibu. - K jejímu volání pak stačí použít vrácený slib s
.then()
získat konečný výsledek. Není třeba přidávat argument zpětného volání, když už máte příslib, že se můžete vrátit.