অ্যাসিঙ্ক ফাংশনের বাইরে অপেক্ষা করুন Using


86

আমি দুটি অ্যাসিঙ্ক ফাংশন একসাথে চেইন করার চেষ্টা করছিলাম, কারণ প্রথমটিতে শর্তসাপেক্ষ রিটার্ন প্যারামিটার ছিল যা দ্বিতীয়টি হয় চালানো, বা মডিউলটি থেকে প্রস্থান করার কারণ হয়েছিল। যাইহোক, আমি চশমার মধ্যে খুঁজে পাচ্ছি না এমন এক বিচিত্র আচরণ পেয়েছি।

async function isInLobby() {
    //promise.all([chained methods here])
    let exit = false;
    if (someCondition) exit = true;
}

এটি আমার কোডের জারজিকৃত স্নিপেট (আপনি এখানে পুরো সুযোগটি দেখতে পারেন ), এটি কোনও খেলোয়াড় যদি ইতিমধ্যে লবিতে থাকে কিনা তা খতিয়ে দেখেন , তবে এটি অপ্রাসঙ্গিক।

পরবর্তী আমাদের এই অ্যাসিঙ্ক ফাংশন রয়েছে।

async function countPlayer() {
    const keyLength = await scardAsync(game);
    return keyLength;
}

এই ফাংশনটি চালানোর দরকার নেই যদি exit === true

আমি চেষ্টা করেছিলাম

const inLobby = await isInLobby();

আমি আশা করি এটি ফলাফলের অপেক্ষায় থাকবে, তাই আমি inLobbyশর্তাধীন চালাতে ব্যবহার করতে countPlayerপারি, তবে আমি কোনও নির্দিষ্ট বিবরণ ছাড়াই একটি টাইপারর পেয়েছি।

আপনি কেন ফাংশনের সুযোগের বাইরে awaitকোনও asyncফাংশন করতে পারবেন না ? আমি জানি এটি একটি চিনির প্রতিশ্রুতি, তাই এটি অবশ্যই বেঁধে রাখা উচিত thenতবে কেন এটি হল যে countPlayerআমি অন্য প্রতিশ্রুতির জন্য অপেক্ষা করতে পারি, তবে বাইরের, আমি তা করতে পারি না await isInLobby?


তুমি আমাদের দেখাতে পারেন যেখানে তুমি করেছ await isInLobby(), এবং কিভাবে inLobbyব্যবহার করা হয়? এছাড়াও, কোথায় / কিভাবে countPlayerবলা হয়?
বার্গি

@ বেরগি আমি আমার রেপোটিকে প্রকৃত প্রসঙ্গে যুক্ত করেছি। প্রশ্নে রাখার জন্য খুব বেশি কোড
স্টার্লিং আর্চার

সমস্যাটি কোথায় আছে তা আমি দেখতে পাচ্ছি না (সম্ভবত আপনি ইতিমধ্যে রেপো আপডেট করেছেন)? আপনি যদি isInLobby().then( … countPlayer().then …অংশটি উল্লেখ করেন তবে সমাধানটি নগণ্য: কেবল সেই ফাংশনটি করুন যাতে এই কলগুলি অন্তর্ভুক্ত থাকে ( (req, res) =>এক) async
বার্গি

@ বেরগি ইস্যুটি ভেঙে গেছে তা নয়, এটি কাজ করে। আমি ঠিক বুঝতে পারি না যে শীর্ষ স্তরের অপেক্ষার জিনিস কেন না। দেখা যাচ্ছে যে এটি সম্পূর্ণরূপে আপনার মডিউলটিকে একটি অ্যাসিঙ্ক ফাংশন হিসাবে বাদ দেওয়া ছাড়া এখনও বিদ্যমান নেই
স্টার্লিং আর্চার

তবে আপনার কোডটির await জন্য কি মোটেই শীর্ষ স্তরের প্রয়োজন নেই ? এ কারণেই আমি ভাবলাম যে আপনি উত্তরটি গ্রহণ করেছেন যা সত্যই প্রশ্নের সমস্যার সাথে সম্পর্কিত নয়।
বার্গি

উত্তর:


74

শীর্ষ স্তর awaitসমর্থিত নয়। এটি কেন, যেমন এই গিথুব ইস্যু নিয়ে স্ট্যান্ডার্ড কমিটি দ্বারা কয়েকটি আলোচনা রয়েছে ।

এখানে একটা ব্যাপার GitHub থেকে thinkpiece কেন শীর্ষ স্তরের অপেক্ষায় রয়েছেন একটি খারাপ ধারণা সম্পর্কে। বিশেষত তিনি পরামর্শ দেন যে আপনার যদি এই জাতীয় কোড থাকে তবে:

// data.js
const data = await fetch( '/data.json' );
export default data;

এখন আমদানি করা কোনও ফাইল data.jsআনয়ন শেষ না হওয়া পর্যন্ত কার্যকর হবে না, সুতরাং আপনার সমস্ত মডিউল লোড এখন অবরুদ্ধ করা হয়েছে। এটি অ্যাপ্লিকেশন মডিউল অর্ডার সম্পর্কে যুক্তিযুক্ত হওয়া খুব কঠিন করে তোলে, যেহেতু আমরা শীর্ষ স্তরের জাভাস্ক্রিপ্টের সাথে সিঙ্ক্রোনালি এবং ভবিষ্যদ্বাণীমূলকভাবে নির্বাহ করছি। যদি এটি অনুমোদিত হয় তবে কোনও ফাংশন সংজ্ঞায়িত হয়ে গেলে তা জটিল হয়ে ওঠে knowing

আমার দৃষ্টিকোণটি হ'ল আপনার মডিউলের পক্ষে এটি লোড করে পার্শ্ব প্রতিক্রিয়া হওয়া খারাপ অভ্যাস। তার মানে আপনার মডিউলটির যে কোনও গ্রাহক কেবল আপনার মডিউলটি প্রয়োজনীয়তার সাথেই পার্শ্ব প্রতিক্রিয়া পাবেন। আপনার মডিউলটি কোথায় ব্যবহার করা যায় এটি এটি খারাপভাবে সীমাবদ্ধ করে। একটি শীর্ষ স্তরের awaitসম্ভবত আপনি কিছু এপিআই থেকে পড়া বা লোড সময়ে কিছু পরিষেবায় কল করছেন means পরিবর্তে আপনার কেবল গ্রাহকরা তাদের নিজস্ব গতিতে ব্যবহার করতে পারেন এমন অ্যাসিঙ্ক ফাংশন রফতানি করা উচিত।


এটি একটি ভাল লিঙ্ক, আপনাকে ধন্যবাদ। এটি একটি লজ্জাজনক শীর্ষ স্তরের সমর্থন নেই। আমি আশা করি। বর্তমানে এটি দাঁড়িয়ে আছে আমাকে এখানে আমার প্রতিশ্রুতিগুলি বাসা বাঁধতে হবে এবং এটি খুব খারাপ অভ্যাস এবং আমি এটি পছন্দ করি না। :( আপনাকে ধন্যবাদ।
স্টার্লিং আর্চার

void async function() { const inLobby = await isInLobby() }()
@ স্টার্লিংআরচার বিকল্পভাবে

@ রবার্টক্লেপ কি inLobbyঅ-অ্যাক্সেসযোগ্য করে ফাংশনটির পক্ষে সেই সুযোগটি পাবে না ?
স্টার্লিং আর্চার

@SterlingArcher হ্যাঁ এটা, এটা সরানো প্রয়োজন হতো সব আপনার কোড সেখানে (মূলত এটি "শীর্ষ স্তরের" উপার্জন)। এটি কেবলমাত্র ব্যবহারের বিকল্প .then()(দুঃখিত, এটি আরও কিছুটা পরিষ্কার করে দেওয়া উচিত ছিল)।
রবার্টক্লেপ

সম্মত হবেন না, তবুও data.js এর ব্যবহারকারী নিজেকে এবং তার সমস্ত নির্ভরতা লোড করার সময় 'ব্লক' হয়ে গেছে, 'ব্লকিং' এর এই ধারণাটি নিজেই খারাপ নয়। শীর্ষ স্তরের প্রত্যাশাকে কিছু নির্ভরতা লোড করা হিসাবে বিবেচনা করা যেতে পারে যা ব্যবহারের প্রকাশের আগে প্রকাশিত হওয়া দরকার one
ইব্রাহিম বেন সালাহ

129

অবশ্যই এটি অবশ্যই আছে:

(async () => {
    await ...

    // all of the script.... 

})();
// nothing else

এটি async সহ একটি দ্রুত ফাংশন তৈরি করে যেখানে আপনি অপেক্ষা করতে পারেন। এটি আপনাকে একটি অ্যাসিঙ্ক ফাংশন তৈরির প্রয়োজনীয়তা সংরক্ষণ করে যা দুর্দান্ত! // ক্রেডিট সিলভ 2611


4
দয়া করে আরও বিশদভাবে ব্যাখ্যা করুন এবং ব্যাখ্যা করুন যে এটি কেন কাজ করে।
পল পিছনে

12
এই উত্তরটি ডাউনওয়োট করা খুব বোকা। এটি async সহ একটি দ্রুত ফাংশন তৈরি করে যেখানে আপনি অপেক্ষা করতে পারেন। এটি আপনাকে একটি অ্যাসিঙ্ক ফাংশন তৈরির প্রয়োজনীয়তা সংরক্ষণ করে যা দুর্দান্ত!
সিলভ 2611

55
সমস্যাটি সমাধান করে না যেহেতু আপনার এখনও awaitএই বেনাম ফাংশনটি দরকার, যা আবার কার্যের বাইরে থেকে কাজ করে না।
মাইকেল

সুতরাং কিভাবে এটি একটি ত্রুটি শর্ত পরিচালনা করবে? এটি কি অপেক্ষার কোডের অভ্যন্তরে অবতরণ করে?
ম্যানুয়েল হার্নান্দেজ

Tks এই greate সাহায্যের বিশেষভাবে কলব্যাক করার প্রতিশ্রুতি একবার লগইন এপিআই, যা reponse ফিরে পুরোপুরি হয় স্টোরেজ getItem পেতে আনা হয়,
Tess এইচএসইউ

10

আরও ভাল হ'ল কোড ব্লকের সামনে অতিরিক্ত সেমিকোলন স্থাপন করা

;(async () => {
    await ...
})();

এটি পূর্বের লাইনের শেষে প্রথম বন্ধনী স্থানান্তর করতে অটো-ফর্ম্যাটর (যেমন vscode এ) বাধা দেয়।

নিম্নলিখিত উদাহরণটিতে সমস্যাটি প্রদর্শিত হতে পারে:

const add = x => y => x+y
const increment = add(1)
(async () => {
    await ...
})();

সেমিকোলন ব্যতীত এটিকে পুনরায় ফর্ম্যাট করা হবে:

const add = x => y => x+y
const increment = add(1)(async () => {
  await Promise(1)
})()

যা স্পষ্টতই ভুল কারণ এটি অ্যাসিঙ্ক ফাংশনটিকে yপ্যারামিটার হিসাবে নির্ধারিত করে এবং ফলাফল থেকে কোনও ফাংশন কল করার চেষ্টা করে (যা আসলে একটি অদ্ভুত স্ট্রিং '1async () => {...}')


20
এটি ভুল সংশোধনকারী নয়। কোনও সেমিকোলন ব্যতীত আপনার ফাংশনটি রানটাইমে পার্স করা হবে এবং আপনি একটি ত্রুটি, লাইন ব্রেক বা কোনও লাইন ব্রেক পাবেন না। আপনার উদাহরণের সঠিক সমাধানটি add(1);হ'ল অ্যাসিঙ্ক ফাংশনের আগে নয় পরে সেমিকোলন যুক্ত করা ।
মাদারার ঘোস্ট

11
এছাড়াও, আমি হাতের কাছে প্রশ্নের সাথে এটি কীভাবে সম্পর্কিত তা আমি সত্যই বুঝতে পারি না।
মাদারার ঘোস্ট

হ্যাঁ আপনি ঠিক. এছাড়াও রানটাইমের জন্য সেমিকোলন দরকার।
উইলিয়াম সিমকো


1

টাইপস্রিপ্ট ৩.৮ থেকে আপনি শীর্ষ স্তরের অপেক্ষার কাজটি করতে পারেন
https://www.typescriptlang.org/docs/handbook/release-notes/tyypecript-3-8.html#-top-level-await
পোস্ট থেকে:
এটি কারণ আগে জাভাস্ক্রিপ্ট (একই বৈশিষ্ট্যযুক্ত অন্যান্য ভাষার পাশাপাশি) অপেক্ষা কেবলমাত্র একটি অ্যাসিঙ্ক ফাংশনের মূল অংশের মধ্যেই ছিল। তবে শীর্ষ স্তরের প্রতীক্ষার সাথে আমরা মডিউলের শীর্ষ স্তরে অপেক্ষা করতে পারি it

const response = await fetch("...");
const greeting = await response.text();
console.log(greeting);

// Make sure we're a module
export {};

একটি সূক্ষ্মতা আছে তা নোট করুন: শীর্ষ স্তরের প্রতীক্ষা কেবলমাত্র একটি মডিউলের শীর্ষ স্তরে কাজ করে এবং টাইপস্ক্রিপ্ট কোনও আমদানি বা রফতানি খুঁজে পেলে ফাইলগুলি কেবলমাত্র মডিউল হিসাবে বিবেচিত হয়। কিছু মৌলিক ক্ষেত্রে, আপনার এটি রফতানি করতে কিছু বয়লারপ্লেট হিসাবে রফতানি লিখতে হবে out।

শীর্ষ স্তরের প্রতীক্ষা সমস্ত পরিবেশে কাজ নাও করতে পারে যেখানে আপনি এই মুহুর্তে আশা করতে পারেন। বর্তমানে, আপনি কেবলমাত্র শীর্ষ স্তর অপেক্ষা করতে পারেন যখন লক্ষ্য সংকলক বিকল্পটি es2017 বা তার বেশি হয় এবং মডিউলটি সংস্থান বা সিস্টেম হয়। বেশ কয়েকটি পরিবেশ এবং বান্ডেলারের মধ্যে সমর্থন সীমিত হতে পারে বা পরীক্ষামূলক সহায়তা সক্ষম করার প্রয়োজন হতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.