तुल्यकालिक पुनरावृत्तियों के साथ प्रतीक्षा के लिए ... का उपयोग करना


11

एमडीएन कहता है for await...of कि दो उपयोग-मामले हैं:

for await...ofबयान async iterable के साथ-साथ सिंक iterables पर वस्तुओं एक पाश से अधिक पुनरावृत्ति बनाता है, ...

मुझे पहले पूर्व के बारे में पता था: async iterables का उपयोग करना Symbol.asyncIterator। लेकिन मुझे अब बाद में दिलचस्पी है: तुल्यकालिक पुनरावृत्तियों।

निम्नलिखित कोड एक तुल्यकालिक पुनरावृत्ति पर पुनरावृत्त करता है - वादों की एक सरणी। यह प्रत्येक वादे के पूरा होने पर घबराहट को अवरुद्ध करता प्रतीत होता है।

async function asyncFunction() {
    try {
        const happy = new Promise((resolve)=>setTimeout(()=>resolve('happy'), 1000))
        const sad = new Promise((_,reject)=>setTimeout(()=>reject('sad')))
        const promises = [happy, sad]
        for await(const item of promises) {
            console.log(item)
        }
    } catch (err) {
        console.log(`an error occurred:`, err)
    }
}

asyncFunction() // "happy, an error occurred: sad" (printed in quick succession, after about 5 seconds)

व्यवहार नीचे दिखाए गए तर्क के अनुसार प्रत्येक वादे का इंतजार करने के समान प्रतीत होता है। क्या यह दावा सही है?

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


2
आपका सवाल क्या है? ऐसा लगता है कि आपके द्वारा प्रदान किए गए उदाहरण
सगी रीका

क्या for await... ofतुल्यकालिक पुनरावृत्तियों के साथ मेरा वर्णन सही है, और यदि हां, तो क्या इससे कोई फर्क पड़ता है कि यह पैटर्न अनहेल्ड रिजेक्ट त्रुटियों को दूर कर सकता है?
बेन एस्टन

"क्या यह सही है" एक सवाल नहीं है। "सही" आप जो भी कहते हैं वह है।
रॉबर्ट हार्वे

क्या आप कोड के माध्यम से अनहेल्ड रिजेक्शन एरर्स के उत्सर्जन को प्रदर्शित कर सकते हैं जो आपने वर्णित किया है?
रॉबर्ट हार्वे

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

जवाबों:


4

हां, यह अजीब है, और आपको ऐसा नहीं करना चाहिए। वादों के सरणियों को पुनरावृत्त न करें, यह आपके द्वारा उल्लिखित अनहेल्ड-रिजेक्शंस की समस्या की ओर जाता है

तो भाषा में इसका समर्थन क्यों किया जाता है? मैला वचन देने वाले वादियों को जारी रखना।

प्रस्ताव के इस भाग पर चर्चा करने वाले मुद्दे की टिप्पणी में आप सटीक तर्क पा सकते हैं :

मुझे लगता है कि हमें वापस गिर जाना चाहिए Symbol.iteratorक्योंकि हमारे मौजूदा वचन शब्दार्थ सभी सिंक चीजों को एसिंक्स चीजों के रूप में उपयोग करने की अनुमति देने के बारे में हैं। आप इसे "सुस्ती" कह सकते हैं। यह @ भूजल के ऊपर दिए गए तर्क का अनुसरण करता है , लेकिन मैं केवल अधिक विस्तार से समानताएं लिखना चाहता हूं।

"चैनिंग" शब्दार्थ .thenसभी इस बारे में हैं। आप एक .thenया स्केलर मूल्य से एक वादा वापस कर सकते हैं ; सभ एक ही है। आप Promise.resolveकिसी वचन में कुछ लपेटने के लिए नहीं कहते हैं, बल्कि किसी वादे पर कुछ करने के लिए - जब आप कुछ-या-अन्य करते हैं तो एक अतुल्यकालिक मूल्य प्राप्त करते हैं।

के शब्दार्थ asyncऔर awaitसभी के रूप में अच्छी तरह से मैला होने के बारे में हैं। आप awaitकिसी async फ़ंक्शन में किसी भी गैर-प्रॉमिस अभिव्यक्ति पर थप्पड़ मार सकते हैं और सब कुछ ठीक काम करता है, बिल्कुल उसी तरह, सिवाय इसके कि आप नौकरी की कतार पर नियंत्रण रखते हैं। इसी तरह, async जब तक आप awaitपरिणाम चाहते हैं, तब तक आप "रक्षात्मक" कर सकते हैं । यदि आपके पास एक फ़ंक्शन है जो एक वादा लौटाता है - जो भी हो! आप इसे एक asyncफ़ंक्शन बना सकते हैं , और, उपयोगकर्ता के दृष्टिकोण से, कुछ भी नहीं बदलता है (भले ही, तकनीकी रूप से, आपको एक अलग वादा वस्तु मिलती है)।

Async पुनरावृत्तियों और जनरेटर को उसी तरह काम करना चाहिए। जैसे आप एक मूल्य का इंतजार कर सकते हैं, गलती से, एक वादा नहीं था, एक उचित उपयोगकर्ता को yield*एक async जनरेटर के भीतर एक सिंक पुनरावृत्ति करने में सक्षम होने की उम्मीद होगी । for awaitलूप समान रूप से "बस काम" करना चाहिए यदि कोई उपयोगकर्ता रक्षात्मक तरीके से एक लूप को चिह्नित करता है, तो सोचता है कि वे शायद एक async सहायक हो सकते हैं।

मुझे लगता है कि इन सभी समानताओं को तोड़ना एक बड़ी बात होगी। यह async पुनरावृत्तियों को कम एर्गोनोमिक बना देगा। आइए चर्चा करते हैं कि अगली बार async जनरेटर / पुनरावृत्तियों TC39 के एजेंडे पर आते हैं।


धन्यवाद। क्या कोई घटना उत्सर्जित होती है, या यह वास्तव में किसी अन्य प्रकार की त्रुटि है? मैं पूछता हूं क्योंकि मुझे लगा कि घटनाएं वेबएपीआई का हिस्सा थीं। क्या कल्पना के अन्य हिस्सों में समान रूप से उपयोग की जाने वाली घटनाओं का उत्सर्जन होता है?
बेन एस्टन

@ 52d6c6af क्या आप unhandledrejectionघटनाओं का जिक्र कर रहे हैं ?
बरगी

हाँ। यह सिर्फ इतना है कि मैंने "त्रुटि" का उपयोग window.addEventListener('unhandledrejection',...करने के लिए संक्षेप में कहा: यह एकमात्र उदाहरण है जिसे मैं ध्यान में रख सकता हूं, जावास्क्रिप्ट द्वारा इस तरह के त्रुटि उत्सर्जन का। मैं यह सोचने के लिए लगभग निश्चित रूप से गलत हूं। अंत में: क्या इस "त्रुटि" का उत्सर्जन कभी भी कंसोल में अवांछित त्रुटि संदेश से परे होता है?
बेन एस्टन

1
@ 52d6c6af ECMAScript और Web API स्पेक्स के बीच एक संयुक्त प्रयास में इसे कैसे निर्दिष्ट किया जाता है, इसके लिए यहां और वहां देखें । नहीं, घटना वास्तव में मायने नहीं रखती है, यह बहुत देर हो चुकी है जब आपको यह मिला है। Afaics, इसका उपयोग केवल क्लाइंट-साइड त्रुटियों की निगरानी के लिए किया जाता है।
बर्गी

यदि यह वास्तव में मायने नहीं रखता है, तो क्या सलाह अभी भी "वादों के सरणियों को पुनरावृत्त नहीं करती है", या क्या यह "जागरूक होना चाहिए कि यह कुछ परिस्थितियों में असफल-तेज़ व्यवहार का प्रदर्शन नहीं करता है"?
बेन एस्टन

0

sadवादा नहीं कर रहा है जा रहा है awaitकि कोड जरूरतों पर इंतजार कर समाप्त करने के लिए - एड जब यह विफल happyकरने से पहले उस पर प्रतीक्षा करने के लिए शुरू कर सकते हैं sadsadवादा करने से पहले विफल हो रहा है happyहल करता है। ( Promise.allइस उपयोग के मामले में बेहतर उपकरण है)


1
मुझे पता है। इसलिए मेरा सवाल है। यदि Promise.allएक बेहतर समाधान है, तो भाषा इस वाक्यविन्यास के लिए क्यों पूरी होती है? for await...ofआसानी से अतुल्यकालिक पुनरावृत्तियों को सीमित करने के लिए लागू किया जा सकता था। लेकिन उन्होंने इसके लिए समकालिक पुनरावृत्तियों (लेकिन (प्रतीत होता है?) नुकसान के साथ) की गणना की। क्यों?
बेन एस्टन

1
आह, मुझे गलत समझा गया। क्या हम पूछ रहे हैं कि for await ... ofतुल्यकालिक पुनरावृत्तियों को क्यों स्वीकार करता है? मैं async जनरेटर का समर्थन करने की कल्पना करता हूँ जो सशर्त रूप से तुल्यकालिक आइटम वापस कर सकता है।
गर्सहोम

हां, विशेष रूप से इतना दिया गया है कि यह अस्वीकृति तार-अप नुकसान का परिचय देता है।
बेन एस्टन

मेरी राय में वादा बनाने में आम तौर पर नुकसान अधिक होता है, और तुरंत इसका इंतजार नहीं करना चाहिए। दुर्भाग्य से यह नुकसान भी अक्सर एक बहुत ही उपयोगी विशेषता है।
गर्सहोम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.