সিঙ্ক্রোনাস পুনরাবৃত্তির সাথে অপেক্ষা করা ... এর জন্য ব্যবহার করা


11

এমডিএন বলছে for await...of দুটি ব্যবহারের ক্ষেত্রে রয়েছে:

for await...ofবিবৃতি ASYNC iterable সেইসাথে সিঙ্ক iterables বস্তু একটি লুপ উপর iterating সৃষ্টি, ...

আমি পূর্বে সম্পর্কে সচেতন ছিলাম: অ্যাসিঙ্ক পুনরায় ব্যবহারযোগ্য 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

হ্যাঁ, এটি আশ্চর্যজনক এবং আপনার এটি করা উচিত নয়। প্রতিশ্রুতিগুলির বিন্যাসগুলিকে পুনরাবৃত্তি করবেন না, এটি আপনার উল্লিখিত আনহ্যান্ডেল-প্রত্যাখ্যান সমস্যার ঠিক দিকে নিয়ে যায় ।

তাহলে কেন এটি ভাষায় সমর্থিত? Opালু প্রতিশ্রুতি শব্দার্থক সঙ্গে চালিয়ে যেতে।

প্রস্তাবের এই অংশটি নিয়ে আলোচনা করা সমস্যার এই মন্তব্যে আপনি সঠিক যুক্তি খুঁজে পেতে পারেন :

আমি মনে করি Symbol.iteratorআমাদের ফিরে যেতে হবে কারণ আমাদের বর্তমান প্রতিশ্রুতিমূলক শব্দার্থবিজ্ঞানগুলি সিঙ্ক জিনিসগুলিকে অ্যাসিঙ্ক জিনিস হিসাবে ব্যবহার করার অনুমতি দেওয়ার বিষয়ে। আপনি এটি "slালু" বলতে পারেন। এটি উপরের ভূগর্ভস্থ জলের যুক্তি অনুসরণ করে , তবে আমি কেবল আরও বিশদগুলিতে সমান্তরালগুলি বানান করতে চাই।

"চেইনিং" শব্দার্থবিজ্ঞানগুলি .thenএই সমস্ত সম্পর্কে। আপনি কোনও প্রতিশ্রুতি .thenবা স্কেলারের মানটি ফিরিয়ে দিতে পারেন ; ইহা সব একই রকম. আপনি Promise.resolveকোনও প্রতিশ্রুতিতে কোনও কিছু মোড় না দেওয়ার জন্য বলেছেন, তবে কোনও প্রতিশ্রুতিতে কিছু ফেলতে বলেছেন - যখন আপনার কাছে কিছু বা অন্য কিছু থাকে তখন একটি অ্যাসিনক্রোনাস মান পান।

এর শব্দার্থক শব্দগুলি asyncএবং awaitপাশাপাশি বেশিরভাগ ক্ষেত্রে sl আপনি awaitকোনও অ্যাসিঙ্ক ফাংশনে কোনও অ-প্রতিশ্রুতি প্রকাশ করতে পারেন এবং জব সারিটিতে আপনি নিয়ন্ত্রণ অর্জন ছাড়া, সবকিছু ঠিক একইভাবে কাজ করে। একইভাবে, আপনি async যতক্ষণ না আপনি awaitফলাফল হিসাবে যতক্ষণ চান "ডিফেন্সিভালি" রাখতে পারেন । আপনার যদি এমন কোনও ফাংশন থাকে যা প্রতিশ্রুতি দেয় - যাই হোক না কেন! আপনি এটি একটি asyncফাংশন তৈরি করতে পারেন এবং ব্যবহারকারীর দৃষ্টিকোণ থেকে কিছুই পরিবর্তন হয় না (এমনকি, প্রযুক্তিগতভাবে, আপনি কোনও পৃথক প্রতিশ্রুতি পেতে পারেন)।

অ্যাসিঙ্ক পুনরায় এবং জেনারেটরগুলির একইভাবে কাজ করা উচিত। ঠিক তেমনি আপনি কোনও মানটির অপেক্ষায় থাকতে পারেন যা দুর্ঘটনাক্রমে কোনও প্রতিশ্রুতি ছিল না, যুক্তিসঙ্গত ব্যবহারকারীর দ্বারা yield*একটি অ্যাসিঙ্ক জেনারেটরের মধ্যে একটি সিঙ্ক পুনরুক্তি করতে সক্ষম হবেন বলে আশা করা যায় । for awaitলুপগুলি একইভাবে "কেবলমাত্র কাজ" করা উচিত যদি কোনও ব্যবহারকারী কোনওভাবে এইভাবে একটি লুপ চিহ্নিত করে, ভেবে যে তারা সম্ভবত একটি অ্যাসিঙ্ক পুনরুক্তি পেতে পারে।

আমি মনে করি যে এই সমস্ত সমান্তরালতাগুলি ভেঙে ফেলা বড় কাজ হবে। এটি অ্যাসিঙ্ক পুনরাবৃত্তিকে কম অর্গনোমিক তৈরি করবে। আসুন এটি সম্পর্কে পরের বার Ascnc জেনারেটর / পুনরুদ্ধারকারীদের TC39 এ এজেন্ডায় নিয়ে আলোচনা করা যাক।


ধন্যবাদ. কোনও ইভেন্টটি নির্গত হয়, বা এটি আসলে অন্য কোনও ধরণের ত্রুটি? আমি জিজ্ঞাসা করি কারণ আমি ভেবেছিলাম ইভেন্টগুলি ওয়েবএপিআইয়ের অংশ ছিল। ঘটনাগুলির নির্গমনটি কি অনুমানের অন্যান্য অংশগুলিতে একই ধরণের ব্যবহৃত হয়?
বেন অ্যাস্টন

@ 52d6c6af আপনি কি unhandledrejectionঘটনার কথা উল্লেখ করছেন ?
বার্গি

হ্যাঁ. window.addEventListener('unhandledrejection',...সংক্ষেপে আমি ব্যবহৃত "ত্রুটি" বাধা দেওয়ার জন্য এটি কেবলমাত্র: জাভাস্ক্রিপ্ট দ্বারা এই ধরণের ত্রুটি নিঃসরণের বিষয়টি আমি মনে রাখতে পারি। আমি অবশ্য এটি ভাবতে প্রায় ভুল করছি। শেষ অবধি: এই "ত্রুটি" এর নির্গমন কি সত্যই কনসোলটিতে একটি অযাচিত ত্রুটি বার্তা থাকার বাইরে গুরুত্বপূর্ণ?
বেন অ্যাস্টন

1
@ 52d6c6af ECMAScript এবং ওয়েব API স্পেসের মধ্যে একটি যৌথ প্রয়াসে এটি কীভাবে নির্দিষ্ট করা হয়েছে সে জন্য এখানে এবং সেখানে দেখুন । না, ইভেন্টটি আসলে কোনও ব্যাপার নয়, আপনি যখন এটি পেয়েছেন তখনই অনেক দেরি হয়ে গেছে। আফসিক্স, এটি কেবল ক্লায়েন্ট-পার্শ্ব ত্রুটিগুলি পর্যবেক্ষণের জন্য ব্যবহৃত হয়।
বার্গি

যদি এটি সত্যিই গুরুত্বপূর্ণ না হয়, তাহলে কি পরামর্শটি এখনও "প্রতিশ্রুতিগুলির বিন্যাসগুলি পুনরায় না করে", বা এটি "সচেতন হোন যে এটি কিছু পরিস্থিতিতে ব্যর্থ-দ্রুত আচরণ প্রদর্শন করে না"?
বেন অ্যাস্টন

0

sadপ্রতিশ্রুতি নয় হচ্ছে awaitযে কোড চাহিদা অপেক্ষায় শেষ করতে - ইডি যখন এটি ব্যর্থ happyআগেই অপেক্ষা করা শুরু করতে পারবেন sadsadপ্রতিশ্রুতি সামনে ব্যর্থ হচ্ছে happyসমাধান করা হয়েছে। ( Promise.allএই ব্যবহারের ক্ষেত্রে উপযুক্ত একটি সরঞ্জাম)


1
আমি জানি. সুতরাং আমার প্রশ্ন। যদি আরও Promise.allভাল সমাধান হয় তবে ভাষা এই বাক্য গঠনটির জন্য কেন যত্ন রাখে? for await...ofসহজেই অ্যাসিনক্রোনাস পুনরাবৃত্তিকে গণনার জন্য কার্যকর করা যেতে পারে। তবে তারা এটিকে সিঙ্ক্রোনাস পুনরাবৃত্ত গণনার জন্য প্রস্তুত করেছিলেন (তবে একটি (মনে হচ্ছে?) ক্ষতি)। কেন?
বেন অ্যাস্টন

1
আহ, আমি ভুল বুঝেছিলাম। আমরা কি জিজ্ঞাসা করছি কেন for await ... ofসিঙ্ক্রোনাস পুনরাবৃত্তিকে গ্রহণ করে? আমি async জেনারেটর সমর্থন করতে কল্পনা করব যা শর্তাধীনভাবে সিঙ্ক্রোনাস আইটেম ফিরে আসতে পারে।
গেরশম

হ্যাঁ, বিশেষত এমনটি প্রদত্ত যে এটি প্রত্যাখ্যানের ওয়্যার-আপের ক্ষতিটি প্রবর্তন করে।
বেন অ্যাস্টন

আমার মতে সমস্যাটি সাধারণত একটি প্রতিশ্রুতি তৈরি করার ক্ষেত্রে, এবং অবিলম্বে এটির জন্য অপেক্ষা না করে। দুর্ভাগ্যক্রমে এই সমস্যাটি প্রায়শই খুব দরকারী বৈশিষ্ট্য is
গেরশম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.