Async/Await और reject: यह शुरुआती लोगों के लिए दर्द क्यों है?
\nक्या आपने कभी async फ़ंक्शन लिखा है, सर्वर से प्रतिक्रिया का इंतज़ार किया है, और फिर UnhandledPromiseRejection पकड़ा है? परिचित लगता है? यह सबसे आम समस्याओं में से एक है जिसका सामना डेवलपर्स को TypeScript में async/await पर स्विच करते समय करना पड़ता है।
Stack Overflow पर प्रश्न "How to reject in async/await syntax?" ने हज़ारों बार देखा गया है। और यह सही भी है। पहली नज़र में ऐसा लगता है कि बस Promise.reject() लौटाना काफी है — और काम हो गया। लेकिन वास्तविक प्रोजेक्ट्स में यह अधिक जटिल है: प्रकार, कॉल चेन, त्रुटि संदर्भ का खो जाना।
इस गाइड में, हम समझेंगे कि TypeScript async फ़ंक्शन में प्रॉमिस को अस्वीकार कैसे करें, throw और return Promise.reject() के बीच अंतर सीखेंगे, और वास्तविक प्रोजेक्ट्स से व्यावहारिक उदाहरण देखेंगे।
मूल बातें: async/await में reject कैसे काम करता है
\nगहराई में जाने से पहले, आइए बुनियादी बातों को याद करें। TypeScript में कोई भी async फ़ंक्शन Promise लौटाता है। यदि इसके अंदर throw होता है या Promise.reject() लौटाया जाता है, तो प्रॉमिस rejected स्थिति में चला जाता है।
// async/await में reject का सबसे सरल उदाहरण\nasync function fetchUser(id: number): Promise<User> {\n if (id <= 0) {\n throw new Error('अमान्य उपयोगकर्ता ID');\n }\n // ...उपयोगकर्ता प्राप्त करने का तर्क\n}\n\nयहाँ throw स्वचालित रूप से reject में बदल जाता है। लेकिन क्या होगा यदि हम पहले से तैयार अस्वीकृत प्रॉमिस लौटाना चाहते हैं?
throw बनाम return Promise.reject()
\nTypeScript में दोनों तरीके काम करते हैं, लेकिन कुछ बारीकियाँ हैं:
\n\n- \n
- throw — अधिक स्वाभाविक तरीका। यह फ़ंक्शन के निष्पादन को रोकता है और नियंत्रण को निकटतम
catchमें स्थानांतरित करता है। \n - return Promise.reject() — स्पष्ट रूप से एक अस्वीकृत प्रॉमिस लौटाता है। यह तब उपयोगी होता है जब किसी अन्य फ़ंक्शन से त्रुटि पास करनी हो। \n
// throw और return Promise.reject() के बीच अंतर\nasync function processOrder(orderId: string): Promise<OrderStatus> {\n // विकल्प 1: throw\n if (!orderId) {\n throw new Error('ऑर्डर ID आवश्यक है');\n }\n \n // विकल्प 2: return Promise.reject\n if (orderId.startsWith('test_')) {\n return Promise.reject(new Error('परीक्षण ऑर्डर की अनुमति नहीं है'));\n }\n \n return { status: 'प्रसंस्करण' };\n}\n\nमहत्वपूर्ण: TypeScript return Promise.reject() के साथ हमेशा सही ढंग से प्रकार नहीं निकालता है। यदि फ़ंक्शन Promise<T> की अपेक्षा करता है, और आप Promise.reject() लौटाते हैं, तो टाइपिंग त्रुटि हो सकती है। ऐसे मामलों में throw का उपयोग करना बेहतर है।
async फ़ंक्शन में reject करते समय सामान्य त्रुटियाँ
\nTypeScript के अनुभवी डेवलपर्स भी कभी-कभी क्लासिक गलतियाँ करते हैं। यहाँ शीर्ष 3 हैं:
\n\n1. कॉल करने वाले कोड में reject को संभालना भूल गए
\nasync function main() {\n // खराब: कोई try/catch नहीं\n const user = await fetchUser(-1);\n console.log(user); // UnhandledPromiseRejection!\n}\n\n// अच्छा:\nasync function mainSafe() {\n try {\n const user = await fetchUser(-1);\n console.log(user);\n } catch (error) {\n console.error('उपयोगकर्ता लाने में विफल:', error);\n }\n}\n\n2. त्रुटियों की गलत टाइपिंग
\nTypeScript में catch ब्लॉक डिफ़ॉल्ट रूप से unknown पकड़ता है। यह सही है, लेकिन कभी-कभी डेवलपर्स बिना जाँच के error.message तक पहुँचने का प्रयास करते हैं।
try {\n await riskyOperation();\n} catch (error) {\n // त्रुटि: error — unknown है\n console.log(error.message); // ❌ 'unknown' प्रकार पर 'message' गुण मौजूद नहीं है\n \n // सही:\n if (error instanceof Error) {\n console.log(error.message);\n } else {\n console.log