Promise.all . में त्रुटियों को पकड़ें

Javascript's Promise.all . का एक सुरक्षित विकल्प

त्रुटियों सहित सभी वादों का इंतजार

यदि आप एक जावास्क्रिप्ट-डेवलपर हैं, तो आपने सबसे अधिक मानक बिल्ट-इन ऑब्जेक्ट Promise और इसके API Promise.all का उपयोग किया है, जो तब तक प्रतीक्षा करता है जब तक कि किसी सरणी में प्रदान किए गए सभी वादे हल नहीं हो जाते। अपने व्यावसायिक तर्क के साथ आगे बढ़ने से पहले विभिन्न अतुल्यकालिक परिणामों की प्रतीक्षा करने का यह एक बहुत ही शानदार तरीका है।

लेकिन यह एपीआई त्रुटियों को संभालता नहीं है। जब भी वादों की श्रेणी में कम से कम एक त्रुटि होती है, तो कार्य तुरंत बंद हो जाता है और आगे कोई परिणाम प्रतीक्षित नहीं होता है।

Promise.allSettled सभी async परिणामों की प्रतीक्षा कर रहा है

सौभाग्य से Promise.allSettled नामक एक दूसरा एपीआई उपलब्ध है जो सभी वादों का इंतजार करने की गारंटी देता है, भले ही परिणाम मान्य हो या कोई त्रुटि। निम्नलिखित कोड इसके उपयोग को प्रदर्शित करता है, जो वास्तव में सरल है, लेकिन आपको बहुत सारे सिरदर्द से बचा सकता है।

Promise.all में मुख्य अंतर यह है कि प्रत्येक वादा जानकारी के एक समूह में हल हो जाता है, जहां दोनों राज्य (पूरा या अस्वीकार) के साथ-साथ मूल्य (पूरा होने के मामले में) या कारण (अस्वीकार के मामले में) उपलब्ध हैं .

एक खाली सरणी प्रदान करना

एक विशेष मामले के बारे में आपको पता होना चाहिए कि जब Promise.allSettled को इनपुट के रूप में एक खाली सरणी प्राप्त होती है, तो यह तुरंत एक खाली सरणी में बदल जाती है। यह तार्किक लगता है और अपेक्षित व्यवहार है, लेकिन मैं अभी भी इसे इंगित करना चाहता था।

/**
 * A simple dummy function that
 * fetches data from multiple
 * endpoints related to a user.
 */
async function fetchUserData(id){
  // A simple array of promises.
  // The first two parameters are
  // mock calls from down below.
  const promises = [
    fetchUserHistory(id),
    fetchUserProfile(id),
    // For testing only, let's throw.
    Promise.reject(new Error('an error'))
];
  
  const values = await Promise.allSettled(promises);
  // values === [
  //    { status: "fulfilled", value: [1, 2, 3] },
  //    { status: "fulfilled", value: {name:"dummy"} },
  //    { status: "rejected", reason: {}
  // ]
}

// The following functions are just mocks
// and should help improve readability
// of the example at the top.

async function fetchUserHistory(id){
  return Promise.resolve([1,2,3]);
}

async function fetchUserProfile(id){
  return Promise.resolve({ name: "dummy" });
}

जैसा कि आप देख सकते हैं, Promise.allSettled, Promise.all के लिए एक बहुत अच्छा अतिरिक्त है और आपको सभी परिणामों की प्रतीक्षा करने की अनुमति देता है, उनके परिणामों से स्वतंत्र। मुझे नहीं लगता कि यह एपीआई हर उपयोग के मामले में फिट होगा, लेकिन यह निश्चित रूप से आपके एसिंक कॉल को ओवरहेड ट्राई-कैच-ब्लॉक में लपेटने से बचाता है।

सुझाव

संबंधित

परिशिष्ट

भाषाएँ