Bạn có hai vấn đề chính.
-
phoneNumber
của bạn biến sẽ không như bạn muốn. Điều đó có thể được khắc phục bằng cách thay đổi thành.forEach()
hoặc.map()
lặp lại mảng của bạn vì điều đó sẽ tạo phạm vi hàm cục bộ cho biến hiện tại. -
Bạn đã tạo ra một cách để biết khi nào tất cả các hoạt động không đồng bộ được thực hiện. Có rất nhiều câu hỏi / câu trả lời trùng lặp chỉ ra cách thực hiện điều đó. Bạn có thể muốn sử dụng
Promise.all()
.
Tôi đề xuất giải pháp này để tận dụng những lời hứa mà bạn đã có:
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
});
Đây là cách hoạt động của nó:
- Gọi cho
contacts.filter(utils.isValidNumber)
để lọc mảng thành chỉ các số hợp lệ. - Gọi
.map()
để lặp lại qua mảng đã lọc đó -
return db.client().get(phoneNumber)
từ.map()
callback để tạo một mảng các lời hứa. - Sau khi nhận được dữ liệu cho số điện thoại, hãy thêm dữ liệu đó vào
contactList
tùy chỉnh của bạn đối tượng (về cơ bản đây là một hiệu ứng phụ của.map()
vòng lặp. - Sử dụng
Promise.all()
trên mảng các lời hứa được trả về để biết khi nào chúng hoàn tất. - Tạo
contactList
đối tượng mà chúng tôi đã xây dựng là giá trị phân giải của lời hứa được trả về. - Sau đó, để gọi nó, chỉ cần sử dụng lời hứa được trả về với
.then()
để có kết quả cuối cùng. Không cần thêm đối số gọi lại khi bạn đã có lời hứa rằng bạn có thể quay lại.