आपके पास दो मुख्य मुद्दे हैं।
-
आपका
phoneNumber
परिवर्तनीय वह नहीं होगा जो आप चाहते हैं। इसे.forEach()
. में बदलकर ठीक किया जा सकता है या.map()
आपके सरणी का पुनरावृत्ति क्योंकि यह वर्तमान चर के लिए स्थानीय फ़ंक्शन स्कोप बनाएगा। -
आपने यह जानने का एक तरीका बनाया है कि सभी async ऑपरेशन कब किए जाते हैं। बहुत सारे डुप्लिकेट प्रश्न/उत्तर हैं जो दिखाते हैं कि यह कैसे करें। आप शायद
Promise.all()
. का उपयोग करना चाहते हैं ।
मैं इस समाधान का सुझाव दूंगा जो आपके पहले से किए गए वादों का लाभ उठाए:
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
});
यहां बताया गया है कि यह कैसे काम करता है:
- कॉल करें
contacts.filter(utils.isValidNumber)
सरणी को केवल मान्य संख्याओं में फ़िल्टर करने के लिए। - कॉल करें
.map()
उस फ़िल्टर किए गए सरणी के माध्यम से पुनरावृति करने के लिए return db.client().get(phoneNumber)
.map()
. से वादों की एक श्रृंखला बनाने के लिए कॉलबैक।- फ़ोन नंबर के लिए डेटा प्राप्त करने के बाद, उस डेटा को अपनी कस्टम
contactList
. में जोड़ें ऑब्जेक्ट (यह अनिवार्य रूप से.map()
. का एक साइड इफेक्ट है लूप। Promise.all()
का उपयोग करें वादों के लौटाए गए सरणी पर यह जानने के लिए कि वे सब कब पूरे हो गए हैं।contactList
बनाएं हमने जो वस्तु बनाई है, वह लौटाए गए वादे का संकल्प मूल्य है।- फिर, इसे कॉल करने के लिए
.then()
. के साथ दिए गए वादे का उपयोग करें अंतिम परिणाम प्राप्त करने के लिए। कॉलबैक तर्क जोड़ने की कोई आवश्यकता नहीं है जब आपके पास पहले से ही एक वादा है कि आप बस वापस आ सकते हैं।