জাভাস্ক্রিপ্ট কখন সিঙ্ক্রোনাস হয়?


202

আমি জাভাস্ক্রিপ্ট সর্বদা অবিচ্ছিন্ন ছিল জন্য আমি ছাপ অধীন ছিল। তবে, আমি শিখেছি যে এমন পরিস্থিতি রয়েছে যেখানে এটি হয় না (অর্থাত্ ডিওএম ম্যানিপুলেশনস)। এটি কখন সিঙ্ক্রোনাস হবে এবং কখন এটি অবিচ্ছিন্ন হবে সে সম্পর্কে কোথাও কোনও ভাল রেফারেন্স রয়েছে? JQuery এ আদৌ প্রভাবিত করে?


14
সর্বদা আজাক্স বাদে।
Defau1t

গৃহীত উত্তরটি ভুল, এবং ভুল পথে চালিত হয়েছে, দয়া করে এটি পরীক্ষা করুন।
সুরজ জৈন

2
এছাড়াও পর্যবেক্ষক উপযোগী ছিল youtube.com/watch?v=8aGhZQkoFbQ ঘটনা লুপ বুঝতে, এবং কিভাবে স্ট্যাক, ওয়েব API, এবং সিঙ্ক এবং ASYNC বিষয়ে টাস্ক কিউ কাজ
mtpultz

1
@ Defau1t এটি কি ভুল নয়, জাভাস্ক্রিপ্ট সবসময় সিঙ্ক্রোনাস থাকে, যখন অজাক্স কল কলব্যাকটি কাতারে শেষ হয়, জাভা স্ক্রিপ্টের সিঙ্ক্রোনাস প্রকৃতির ক্ষেত্রে এটি কীভাবে ব্যতিক্রম।
সুরজ জৈন

উত্তর:


281

জাভাস্ক্রিপ্ট সর্বদা সিঙ্ক্রোনাস এবং একক থ্রেডযুক্ত। আপনি যদি কোনও পৃষ্ঠায় একটি জাভাস্ক্রিপ্ট ব্লক কোড চালাচ্ছেন তবে সেই পৃষ্ঠায় অন্য কোনও জাভাস্ক্রিপ্ট বর্তমানে কার্যকর করা হবে না।

জাভাস্ক্রিপ্ট এটি যে অর্থে তৈরি করতে পারে কেবল তাত্পর্যপূর্ণ, উদাহরণস্বরূপ, এজাক্স কল। আজাক্স কলটি কার্যকর করা বন্ধ করবে এবং কলটি পুনরায় (সফলভাবে বা অন্যথায়) প্রত্যাবর্তন না হওয়া অবধি অন্যান্য কোড কার্যকর করতে সক্ষম হবে, যে সময়ে কলব্যাকটি সিঙ্ক্রোনিকভাবে চলবে। এই মুহুর্তে অন্য কোনও কোড চলবে না। এটি বর্তমানে চলমান অন্য কোনও কোডকে বাধাগ্রস্ত করবে না।

জাভাস্ক্রিপ্ট টাইমারগুলি একই ধরণের কলব্যাক দিয়ে পরিচালনা করে।

জাভাস্ক্রিপ্টকে অ্যাসিঙ্ক্রোনাস হিসাবে বর্ণনা করা সম্ভবত বিভ্রান্তিকর। এটি আরও সঠিকভাবে বলা যায় যে জাভাস্ক্রিপ্ট বিভিন্ন কলব্যাক প্রক্রিয়া সহ সিঙ্ক্রোনাস এবং একক থ্রেডযুক্ত।

এগুলিকে সিঙ্ক্রোনসিভ করতে ( async: falseবিকল্প সহ) করতে jQuery এর অ্যাজাক্স কলগুলিতে একটি বিকল্প রয়েছে । প্রাথমিকভাবে এটি ভুলভাবে ব্যবহার করার জন্য প্রলুব্ধ হতে পারে কারণ এটি একটি আরও traditionalতিহ্যবাহী প্রোগ্রামিং মডেলকে মঞ্জুরি দেয় যা একজনের আরও অভ্যস্ত হতে পারে। এটির সমস্যা হবার কারণ হ'ল এই বিকল্পটি সমস্ত ইভেন্ট হ্যান্ডলার এবং টাইমার সহ সমাপ্ত না হওয়া পর্যন্ত পৃষ্ঠাটিতে সমস্ত জাভাস্ক্রিপ্ট ব্লক করবে ।


31
দুঃখিত, আমি এই বিবৃতিটি বেশ বুঝতে পারি নি "কলটি ফিরে না আসা (সাফল্য বা ত্রুটিতে) কোড কার্যকর করা বন্ধ করবে"। আপনি বিস্তারিত বলতে পারেন আপনি যখন "" এটি চলমান অন্য কোনও কোডকে বাধাগ্রস্ত করবে না "বলবেন তখন এই বিবৃতিটি কীভাবে সত্য হতে পারে; আপনি কি প্রথম বিবৃতিতে কলব্যাক্স কোড সম্পর্কে কথা বলছেন? আমাকে আলোকিত করুন।
কৃষ্ণ

2
নেটটসের একটি টিউটোরিয়াল রয়েছে যা এখানে অ্যাসিঙ্কের বেসিকগুলি
জাভাস্ক্রিপ্ট-

26
@ ক্লেটাস "কলটি রিটার্ন না হওয়া পর্যন্ত কোডটি কার্যকর করা বন্ধ করবে" বিবৃতিটির সংশোধন প্রয়োজন কারণ মৃত্যুদণ্ড কার্যকর হচ্ছে না। কোড প্রয়োগ কার্যকর হতে পারে। অন্যথায়, এর অর্থ হ'ল কলটি সিঙ্ক্রোনাস।
এইচএস

1
আমিও উক্তিটি বুঝতে পারি নি।
ট্যুইরি করুন

12
এই উত্তরটি অবিশ্বাস্যভাবে বিভ্রান্তিকর এবং বিভ্রান্তিকর। পরিবর্তে সিএমএস 'বা ফারাজ আহমদের উত্তর দেখুন।
আয়ানো

214

জাভাস্ক্রিপ্ট একক থ্রেডেড এবং একটি সিঙ্ক্রোনাস এক্সিকিউশন মডেল রয়েছে। একক থ্রেডের অর্থ হ'ল একবারে একটি কমান্ড কার্যকর করা হচ্ছে। সিঙ্ক্রোনাস অর্থ একটি সময়ে একটি অর্থাৎ কোডের একটি লাইন কোড প্রদর্শিত হওয়ার সাথে সাথে কার্যকর করা হয়। তাই জাভাস্ক্রিপ্টে একটি জিনিস একটি সময়ে ঘটছে।

এক্সিকিউশন কনটেক্সট

জাভাস্ক্রিপ্ট ইঞ্জিন ব্রাউজারে অন্যান্য ইঞ্জিনের সাথে যোগাযোগ করে। জাভাস্ক্রিপ্ট এক্সিকিউশন স্ট্যাকের নীচে বিশ্বব্যাপী প্রসঙ্গ রয়েছে এবং তারপরে যখন আমরা ফাংশনগুলি শুরু করি তখন জাভাস্ক্রিপ্ট ইঞ্জিনটি সম্পর্কিত ফাংশনগুলির জন্য নতুন এক্সিকিউশন কনটেক্সট তৈরি করে। যখন ডাকা ফাংশনটি তার কার্যনির্বাহী প্রসঙ্গটি প্রস্থান করে তখন স্ট্যাক থেকে পপ করা হয় এবং তারপরে পরবর্তী নির্বাহের প্রসঙ্গটি পপড হয় এবং এইভাবে ...

উদাহরণ স্বরূপ

function abc()
{
   console.log('abc');
}


function xyz()
{
   abc()
   console.log('xyz');
}
var one = 1;
xyz();

উপরের কোডে একটি গ্লোবাল এক্সিকিউশন প্রসঙ্গ তৈরি করা হবে এবং এই প্রসঙ্গে var oneসংরক্ষণ করা হবে এবং এর মান 1 হবে ... যখন এক্সওয়াইজ () ডাকা হবে তখন একটি নতুন এক্সিকিউশন প্রসঙ্গ তৈরি হবে এবং যদি আমরা কোনও ভেরিয়েবল সংজ্ঞায়িত করে থাকি xyz ফাংশনে সেই পরিবর্তনগুলি xyz () এর কার্যকর প্রসঙ্গে সংরক্ষণ করা হবে। Xyz ফাংশনে আমরা abc () এবং তারপরে abc () এক্সিকিউশন কনটেক্সট তৈরি করে এবং এক্সিকিউশন স্ট্যাকের উপরে রাখি ... এখন যখন abc () সমাপ্ত হবে তখন এর প্রসঙ্গটি স্ট্যাক থেকে পপ করা হবে, তখন xyz () প্রসঙ্গটি থেকে পপ করা হবে স্ট্যাক এবং তারপরে বিশ্বব্যাপী প্রসঙ্গটি পপ করা হবে ...

এখন অ্যাসিনক্রোনাস কলব্যাক সম্পর্কে; অ্যাসিনক্রোনাস মানে এক সময় একাধিক।

ফাঁসির স্ট্যাকের মতোই ইভেন্টের সারি রয়েছে । যখন আমরা জাভাস্ক্রিপ্ট ইঞ্জিনের কিছু ইভেন্ট সম্পর্কে অবহিত হতে চাই আমরা সেই ইভেন্টটি শুনতে পারি এবং সেই ইভেন্টটি সারিতে রাখা হয়। উদাহরণস্বরূপ একটি Ajax অনুরোধ ইভেন্ট, বা HTTP অনুরোধ ইভেন্ট।

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

উদাহরণস্বরূপ জাভাস্ক্রিপ্ট ইঞ্জিন দ্বারা সম্পাদন স্ট্যাক এবং ইভেন্টের সারির হ্যান্ডলিংয়ের ব্যাখ্যা দেওয়ার জন্য নীচের কোডটি দেখুন।

function waitfunction() {
    var a = 5000 + new Date().getTime();
    while (new Date() < a){}
    console.log('waitfunction() context will be popped after this line');
}

function clickHandler() {
    console.log('click event handler...');   
}

document.addEventListener('click', clickHandler);


waitfunction(); //a new context for this function is created and placed on the execution stack
console.log('global context will be popped after this line');

এবং

<html>
    <head>

    </head>
    <body>

        <script src="program.js"></script>
    </body>
</html>

এখন ওয়েবপৃষ্ঠাটি চালান এবং পৃষ্ঠায় ক্লিক করুন, এবং কনসোলে আউটপুট দেখুন। আউটপুট হবে

waitfunction() context will be popped after this line
global context will be emptied after this line
click event handler...

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

সুতরাং জাভাস্ক্রিপ্ট সর্বদা সিঙ্ক্রোনাস।


16
এই উত্তরটি খুব স্পষ্ট, এটি আরও upvotes পাওয়া উচিত।
রানু

7
অবশ্যই আমি জাভাস্ক্রিপ্টের অ্যাসিক্রোনাস আচরণের সর্বোত্তম ব্যাখ্যা read
চার্লস জাইমেট

1
কার্যকর করার প্রসঙ্গে এবং সারি সম্পর্কে সুন্দর ব্যাখ্যা।
দিব্যংশু মাইথানি

1
অবশ্যই এটি আপনাকে এক্সিকিউটিভ কনটেক্সট স্ট্যাকের বিষয়ে কিছুটা পড়তে হবে, এবং কেবল এটির খালি হওয়া এবং ইভেন্টের ক্যো আমাকে শেষ পর্যন্ত অনুভব করে যা আমি জাভা স্ক্রিপ্টের নির্গমনকে নির্বিচারে বুঝতে পারি। সবচেয়ে খারাপটি হ'ল আমি মনে করি এটি কেবল পঠনের একটি পৃষ্ঠা নেয় তবে আমি এটি খুব কমই খুঁজে পাই। তাহলে কেউ কেন শুধু তা বলে না? হয় তারা জানে না কী? তবে আমি অনুভব করি যদি জেএস টিউটোরিয়ালটি থাকে তবে এটি আমাকে অনেক সময় বাঁচাতে পারত। >: |
মার্শাল নৈপুণ্য

2
নিখুঁত ব্যাখ্যা!
জুলসি

100

জাভাস্ক্রিপ্ট একক থ্রেডযুক্ত এবং আপনি যখন কোনও সাধারণ সিঙ্ক্রোনাস কোড-ফ্লো এক্সিকিউশনে কাজ করেন সর্বদা।

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

আমি আপনাকে নীচের নিবন্ধটি একবার দেখার পরামর্শ দিচ্ছি:

এই নিবন্ধটি আপনাকে জাভাস্ক্রিপ্টের একক-থ্রেডযুক্ত প্রকৃতি এবং কীভাবে অভ্যন্তরীণভাবে টাইমারগুলি কাজ করে এবং কীভাবে অ্যাসিঙ্ক্রোনাস জাভাস্ক্রিপ্ট কার্যকর করা যায় তা বুঝতে সহায়তা করবে।

ASYNC


গৃহীত উত্তরের বিভ্রান্তি আমরা কি সেই ক্ষেত্রে কিছু করতে পারি? /
সুরজ জৈন

8

জেএস কীভাবে এই প্রশ্নটি কাজ করে তা সত্যিই বুঝতে পারে এমন ব্যক্তির কাছে মনে হতে পারে, তবে জেএস ব্যবহার করা বেশিরভাগ লোকের এত গভীর অন্তর্দৃষ্টি নেই (এবং প্রয়োজনীয়তার প্রয়োজন নেই) এবং তাদের কাছে এটি মোটামুটি বিভ্রান্তিমূলক বিষয়, আমি করব সেই দৃষ্টিকোণ থেকে উত্তর দেওয়ার চেষ্টা করুন।

জেএস এর কোডটি কার্যকর করার পদ্ধতিতে সিঙ্ক্রোনাস। প্রতিটি লাইনটি সম্পূর্ণ হওয়ার আগে কেবল লাইনের পরে চলে এবং যদি সেই লাইন যদি কোনও ফাংশন কল করে তারপরে সম্পূর্ণ ect ...

বিভ্রান্তির মূল বিষয়টি এ থেকে উদ্ভূত হয় যে আপনার ব্রাউজারটি জেএসকে যে কোনও সময় আরও কোড উত্তেজিত করতে সক্ষম করতে সক্ষম হয়েছে (কনসোলের কোনও পৃষ্ঠায় আপনি কীভাবে আরও জেএস কোডকে উত্তেজিত করতে পারেন তার উদাহরণ)। উদাহরণস্বরূপ জেএসের কলব্যাক ফাংশন রয়েছে যার উদ্দেশ্য জেএসকে অবিচ্ছিন্নভাবে বেহাত হতে দেওয়া যাতে জেএসের আরও অংশগুলি চালানো যেতে পারে এমন কোনও জেএস ফাংশনের জন্য অপেক্ষা করতে থাকে যা (আইডির একটি GETকল) কোনও উত্তর ফিরে আসে, জেএস অবধি চালিয়ে যেতে থাকবে ব্রাউজারটির সেই মুহূর্তে একটি উত্তর রয়েছে ইভেন্ট লুপ (ব্রাউজার) জেএস কোড কার্যকর করবে যা কলব্যাক ফাংশনটি কল করে।

যেহেতু ইভেন্টের লুপ (ব্রাউজার) আরও জেএসকে ইনপুট করতে পারে সেই অর্থে যে কোনও সময়ে জেএস অ্যাসিনক্রোনাস (প্রাথমিক বিষয়গুলি যা ব্রাউজারকে জেএস কোড ইনপুট আনতে পারে টাইমআউট, কলব্যাক এবং ইভেন্টগুলি)

আমি আশা করি এটি কারওর পক্ষে সহায়ক হওয়ার পক্ষে যথেষ্ট স্পষ্ট।


4

সংজ্ঞা

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

কম্পিউটার প্রোগ্রামিংয়ে অ্যাসিনক্রনি মূল প্রোগ্রাম প্রবাহের চেয়ে পৃথক ইভেন্টগুলির সংঘটন এবং এই জাতীয় ঘটনাগুলি মোকাবিলার উপায়গুলি বোঝায়। এটি "বাহ্যিক" ইভেন্টগুলি হতে পারে যেমন সিগন্যালগুলির আগমন, বা কোনও প্রোগ্রামের দ্বারা উত্সাহিত ক্রিয়াকলাপগুলি প্রোগ্রামের ফলাফলের জন্য অপেক্ষা করতে বাধা না দিয়ে প্রোগ্রামের প্রয়োগের সাথে সাথে ঘটে থাকে।

নন-জাভাস্ক্রিপ্ট কোড জাভাস্ক্রিপ্টের ইভেন্টের কিছু ক্যুতে এই জাতীয় "বাইরের" ইভেন্টগুলিকে সারি করতে পারে। তবে এটি যতদূর যায়।

প্রিম্পশন নেই

আপনার স্ক্রিপ্টে কিছু অন্যান্য জাভাস্ক্রিপ্ট কোড চালানোর জন্য জাভাস্ক্রিপ্ট কোড চালানোর কোনও বাহ্যিক বাধা নেই । জাভাস্ক্রিপ্টের টুকরোগুলি একের পর এক সম্পাদিত হয় এবং প্রতিটি ইভেন্টের সারিতে ইভেন্টগুলির ক্রম এবং সেই সারিগুলির অগ্রাধিকার দ্বারা আদেশটি নির্ধারিত হয়।

উদাহরণস্বরূপ, আপনি নিখুঁতভাবে নিশ্চিত হতে পারেন যে নিম্নলিখিত কোডের টুকরোগুলি কার্যকর করার সময় আর কোনও জাভাস্ক্রিপ্ট (একই স্ক্রিপ্টে) কার্যকর হবে না:

let a = [1, 4, 15, 7, 2];
let sum = 0;
for (let i = 0; i < a.length; i++) {
    sum += a[i];
}

অন্য কথায়, জাভাস্ক্রিপ্টে কোনও পূর্বশক্তি নেই । ইভেন্টের সারিতে যাই থাকুক না কেন, এই জাতীয় কোডের অংশটি শেষ না হওয়া পর্যন্ত এই ইভেন্টগুলির প্রসেসিংয়ের জন্য অপেক্ষা করতে হবে। ইকামাস্ক্রিপ্ট স্পেসিফিকেশন বিভাগ 8.4 বিভাগে এবং চাকরির সারিতে বলেছেন :

কোনও কাজের ফাঁসি কার্যকর করা কেবল তখনই শুরু করা যেতে পারে যখন কোনও চলমান কার্যকরকরণ প্রসঙ্গ না থাকে এবং এক্সিকিউশন কনটেক্সট স্ট্যাকটি খালি থাকে।

অ্যাসিঙ্ক্রোনির উদাহরণ

যেমন অন্যরা ইতিমধ্যে লিখেছেন, এমন অনেকগুলি পরিস্থিতি রয়েছে যেখানে জাভাস্ক্রিপ্টে অ্যাসিঙ্ক্রোনি কার্যকর হয় এবং এটিতে সর্বদা একটি ইভেন্টের সারি জড়িত থাকে, যা জাভা স্ক্রিপ্টের কার্যকর হতে পারে যখন অন্য কোনও জাভাস্ক্রিপ্ট কোড কার্যকর করা হয় না:

  • setTimeout(): এজেন্ট (যেমন ব্রাউজার) সময়সীমা শেষ হওয়ার পরে ইভেন্টের সারিতে একটি ইভেন্ট রাখবে। সময়টির পর্যবেক্ষণ এবং কাতারে ইভেন্টটি স্থাপন জাভাস্ক্রিপ্ট কোড দ্বারা ঘটে এবং তাই আপনি ভাবতে পারেন যে এটি কিছু জাভাস্ক্রিপ্ট কোডের সম্ভাব্য সম্পাদনের সমান্তরালে ঘটেছে। তবে প্রদত্ত কলব্যাক setTimeoutকেবল তখনই কার্যকর করতে পারে যখন বর্তমানে কার্যকর হওয়া জাভাস্ক্রিপ্ট কোডটি সমাপ্তিতে পৌঁছেছে এবং উপযুক্ত ইভেন্টের সারিটি পড়া হচ্ছে being

  • fetch(): এজেন্ট কোনও এইচটিটিপি অনুরোধ সম্পাদনের জন্য ওএস ফাংশন ব্যবহার করবে এবং যে কোনও আগত প্রতিক্রিয়ার জন্য নিরীক্ষণ করবে। আবার, এই জাভাস্ক্রিপ্ট-টাস্কটি কিছু জাভাস্ক্রিপ্ট কোডের সমান্তরালে চলতে পারে যা এখনও চালানো হচ্ছে। কিন্তু প্রতিশ্রুতি সমাধানের পদ্ধতিটি, যা দ্বারা প্রতিশ্রুতি ফিরে fetch()পেয়েছে তা সমাধান করবে কেবলমাত্র বর্তমানে কার্যকর হওয়া জাভাস্ক্রিপ্ট সম্পূর্ণ হওয়ার পরে চলেছে ute

  • requestAnimationFrame(): ব্রাউজারের রেন্ডারিং ইঞ্জিন (নন-জাভাস্ক্রিপ্ট) যখন কোনও পেইন্ট অপারেশন করার জন্য প্রস্তুত হয় তখন জাভাস্ক্রিপ্ট কাতারে একটি ইভেন্ট স্থাপন করবে। জাভাস্ক্রিপ্ট ইভেন্টটি প্রক্রিয়া করা হলে কলব্যাক ফাংশনটি কার্যকর করা হয়।

  • queueMicrotask(): তাত্ক্ষণিকভাবে মাইক্রোটাস্ক সারিতে একটি ইভেন্ট স্থাপন করে। কল স্ট্যাক খালি থাকলে এবং ইভেন্টটি গ্রাস হয়ে গেলে কলব্যাক কার্যকর করা হবে।

আরও অনেক উদাহরণ রয়েছে, তবে এই সমস্ত ফাংশনগুলি মূল একমাস্ক্রিপ্ট দ্বারা নয়, হোস্ট পরিবেশ দ্বারা সরবরাহ করা হয়েছে। কোর ইকামাস্ক্রিপ্টের সাহায্যে আপনি সিঙ্ক্রোনসের সাহায্যে একটি প্রতিশ্রুতি কাজ কাতারে একটি ইভেন্ট স্থাপন করতে পারেন Promise.resolve()

ভাষা গঠন

ECMAScript যেমন asynchrony প্যাটার্ন সমর্থন করার জন্য বিভিন্ন ভাষা নির্মান, প্রদান করে yield, async, await। তবে কোনও ভুল হওয়ার সুযোগ না দিন: কোনও জাভাস্ক্রিপ্ট কোড কোনও বাহ্যিক ইভেন্ট দ্বারা বাধাগ্রস্ত হবে না । "বিঘ্ন" যা সরবরাহ করে yieldএবং awaitমনে হয় কেবল কোনও ফাংশন কল থেকে ফিরে আসার এবং এর কার্য সম্পাদন প্রসঙ্গে পুনরুদ্ধার করার পরে কেবল জেএস কোড (ক্ষেত্রে yield) বা ইভেন্টের সারি (ইভেন্টের সারি) পুনরুদ্ধার করার একটি নিয়ন্ত্রিত pred await)।

ডিওএম ইভেন্ট হ্যান্ডলিং

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

এটি প্রাক-উদ্দীপক সম্মতি হিসাবে দেখা দিতে পারে, তবে তা নয়: একবার আপনার ইভেন্ট হ্যান্ডলার (গুলি) ফিরলে, ডম এপিআই শেষ পর্যন্ত ফিরে আসবে এবং মূল জাভাস্ক্রিপ্ট কোডটি অবিরত থাকবে।

অন্যান্য ক্ষেত্রে ডম এপিআই যথাযথ ইভেন্ট সারিতে কেবল একটি ইভেন্ট প্রেরণ করবে এবং কল স্ট্যাক খালি হয়ে যাওয়ার পরে জাভাস্ক্রিপ্ট এটিকে বেছে নেবে।

দেখুন সমলয় এবং অ্যাসিঙ্ক্রোনাস ঘটনা


0

সব ক্ষেত্রেই সিনক্রোনাস।

এর সাথে থ্রেড ব্লক করার উদাহরণ Promises:

  const test = () => new Promise((result, reject) => {
    const time = new Date().getTime() + (3 * 1000);

    console.info('Test start...');

    while (new Date().getTime() < time) {
      // Waiting...
    }

    console.info('Test finish...');
  });

  test()
    .then(() => console.info('Then'))
    .finally(() => console.info('Finally'));

  console.info('Finish!');

আউটপুটটি হবে:

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