Anda memiliki dua masalah utama.
-
phoneNumber
. Anda variabel tidak akan seperti yang Anda inginkan. Itu bisa diperbaiki dengan mengubah ke.forEach()
atau.map()
iterasi array Anda karena itu akan membuat cakupan fungsi lokal untuk variabel saat ini. -
Anda telah membuat cara untuk mengetahui kapan semua operasi asinkron selesai. Ada banyak pertanyaan/jawaban duplikat yang menunjukkan bagaimana melakukannya. Anda mungkin ingin menggunakan
Promise.all()
.
Saya menyarankan solusi ini yang memanfaatkan janji yang sudah Anda miliki:
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
});
Begini cara kerjanya:
- Hubungi
contacts.filter(utils.isValidNumber)
untuk memfilter larik ke angka yang valid saja. - Panggil
.map()
untuk beralih melalui array yang difilter itu return db.client().get(phoneNumber)
dari.map()
panggilan balik untuk membuat serangkaian janji.- Setelah mendapatkan data untuk nomor telepon, tambahkan data tersebut ke
contactList
khusus Anda objek (ini pada dasarnya adalah efek samping dari.map()
lingkaran. - Gunakan
Promise.all()
pada deretan janji yang dikembalikan untuk mengetahui kapan semuanya selesai. - Buat
contactList
objek yang kita buat menjadi nilai penyelesaian dari janji yang dikembalikan. - Lalu, untuk memanggilnya cukup gunakan janji yang dikembalikan dengan
.then()
untuk mendapatkan hasil akhir. Tidak perlu menambahkan argumen panggilan balik ketika Anda sudah memiliki janji bahwa Anda bisa kembali.