আমি মনে করি আমি এটি বেশ সুন্দরভাবে বর্ণনা করতে পারি। যেহেতু nextTick
বর্তমান অপারেশনের শেষে বলা হয়ে থাকে, এটিকে পুনরাবৃত্তি বলে কল করা ঘটনা লুপটিকে অবিরত করা অবরুদ্ধ করে। setImmediate
ইভেন্ট লুপটির চেক পর্বে গুলি চালিয়ে এটিকে সমাধান করে, ইভেন্ট লুপটি স্বাভাবিকভাবে চালিয়ে যেতে দেয়।
┌───────────────────────┐
┌─>│ timers │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
│ │ I/O callbacks │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
│ │ idle, prepare │
│ └──────────┬────────────┘ ┌───────────────┐
│ ┌──────────┴────────────┐ │ incoming: │
│ │ poll │<─────┤ connections, │
│ └──────────┬────────────┘ │ data, etc. │
│ ┌──────────┴────────────┐ └───────────────┘
│ │ check │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
└──┤ close callbacks │
└───────────────────────┘
উত্স: https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
লক্ষ করুন যে চেক পর্বটি ভোটগ্রহণের পর্বের অব্যবহিত পরে। এটি কারণ আপনার ভোটদানগুলি setImmediate
চালিত হতে চলেছে পোলের পর্ব এবং I / O কলব্যাকগুলি সম্ভবত places সুতরাং আদর্শভাবে those কলগুলির বেশিরভাগই প্রকৃতপক্ষে তাত্ক্ষণিকভাবে হবে, ঠিক ততটা তাত্ক্ষণিক নয় nextTick
যা প্রতিটি ক্রিয়াকলাপের পরে পরীক্ষা করা হয় এবং ইভেন্ট লুপের বাইরে প্রযুক্তিগতভাবে উপস্থিত থাকে।
এর মধ্যে পার্থক্য সামান্য উদাহরণ কটাক্ষপাত করা যাক setImmediate
এবং process.nextTick
:
function step(iteration) {
if (iteration === 10) return;
setImmediate(() => {
console.log(`setImmediate iteration: ${iteration}`);
step(iteration + 1); // Recursive call from setImmediate handler.
});
process.nextTick(() => {
console.log(`nextTick iteration: ${iteration}`);
});
}
step(0);
ধরা যাক আমরা কেবল এই প্রোগ্রামটি চালিয়েছি এবং ইভেন্ট লুপের প্রথম পুনরাবৃত্তির মধ্য দিয়ে যাচ্ছি। এটি step
পুনরাবৃত্তি শূন্যের সাথে ফাংশনে কল করবে । এরপরে এটি দুটি হ্যান্ডলারের নিবন্ধভুক্ত করবে, একজনের জন্য setImmediate
এবং একজনের জন্য process.nextTick
। তারপরে আমরা setImmediate
হ্যান্ডলার থেকে পুনরাবৃত্তভাবে এই ফাংশনটি কল করি যা পরবর্তী চেক পর্বে চলবে। nextTick
হ্যান্ডলার বর্তমান অপারেশন ঘটনা লুপ বিঘ্নিত শেষে চালানো হবে, তাই যদিও এটি দ্বিতীয় নিবন্ধিত ছিল এটা আসলে প্রথম চালানো হবে।
nextTick
ক্রমটি শেষ হয়ে যায়: বর্তমান অপারেশন শেষ হওয়ার সাথে সাথে আগুন জ্বলতে থাকে, পরবর্তী ইভেন্টের লুপটি শুরু হয়, সাধারণ ইভেন্টের লুপ পর্যায়ক্রমে কার্যকর হয়, setImmediate
আগুন জ্বলতে থাকে এবং পুনরায় step
ক্রিয়াটি পুনরায় প্রক্রিয়া শুরু করার জন্য আমাদের ফাংশনটি কল করে। বর্তমান অপারেশন শেষ, nextTick
আগুন ইত্যাদি
উপরের কোডটির আউটপুট হবে:
nextTick iteration: 0
setImmediate iteration: 0
nextTick iteration: 1
setImmediate iteration: 1
nextTick iteration: 2
setImmediate iteration: 2
nextTick iteration: 3
setImmediate iteration: 3
nextTick iteration: 4
setImmediate iteration: 4
nextTick iteration: 5
setImmediate iteration: 5
nextTick iteration: 6
setImmediate iteration: 6
nextTick iteration: 7
setImmediate iteration: 7
nextTick iteration: 8
setImmediate iteration: 8
nextTick iteration: 9
setImmediate iteration: 9
এখন আসুন এর পরিবর্তে আমাদের পুনরাবৃত্ত কলকে step
আমাদের nextTick
হ্যান্ডলারের দিকে সরানো যাক setImmediate
।
function step(iteration) {
if (iteration === 10) return;
setImmediate(() => {
console.log(`setImmediate iteration: ${iteration}`);
});
process.nextTick(() => {
console.log(`nextTick iteration: ${iteration}`);
step(iteration + 1); // Recursive call from nextTick handler.
});
}
step(0);
এখন আমরা করতে recursive কল সরানো হয়েছে যে step
মধ্যে nextTick
হ্যান্ডলার জিনিষ একটি ভিন্ন অনুক্রমে আচরণ করবে। আমাদের ইভেন্ট লুপ রান এবং কলের প্রথম পুনরাবৃত্তির step
একটি নিবন্ধনের setImmedaite
হ্যান্ডলার সেইসাথে একটি nextTick
হ্যান্ডলার। বর্তমান অপারেশনটি আমাদের nextTick
হ্যান্ডলার ফায়ারগুলি শেষ হওয়ার পরে যা পুনরাবৃত্তভাবে step
অন্য setImmediate
হ্যান্ডলারের পাশাপাশি অন্য হ্যান্ডলারকে কল করে এবং নিবন্ধভুক্ত করে nextTick
। যেহেতু কোনও nextTick
হ্যান্ডলার বর্তমান অপারেশনের পরে জ্বলজ্বল করে, তাই কোনও nextTick
হ্যান্ডলারের মধ্যে হ্যান্ডলারের নিবন্ধকরণের nextTick
ফলে বর্তমান হ্যান্ডলার অপারেশন শেষ হওয়ার পরে দ্বিতীয় হ্যান্ডলারটি তত্ক্ষণাত্ চলতে পারে। nextTick
হ্যান্ডেলার অগ্নিসংযোগ রাখা হবে, কখনও অব্যাহত থেকে বর্তমান ঘটনা লুপ প্রতিরোধ। আমরা আমাদের সব মাধ্যমে পেতে হবেnextTick
হ্যান্ডলারের আগে আমরা একক setImmediate
হ্যান্ডলার আগুন দেখতে পাই ।
উপরের কোডটির আউটপুটটি শেষ হচ্ছে:
nextTick iteration: 0
nextTick iteration: 1
nextTick iteration: 2
nextTick iteration: 3
nextTick iteration: 4
nextTick iteration: 5
nextTick iteration: 6
nextTick iteration: 7
nextTick iteration: 8
nextTick iteration: 9
setImmediate iteration: 0
setImmediate iteration: 1
setImmediate iteration: 2
setImmediate iteration: 3
setImmediate iteration: 4
setImmediate iteration: 5
setImmediate iteration: 6
setImmediate iteration: 7
setImmediate iteration: 8
setImmediate iteration: 9
নোট করুন যে আমরা যদি পুনরাবৃত্ত কলটিতে বাধা সৃষ্টি না করে এবং 10 টি পুনরাবৃত্তির পরে এটি বাতিল করে দিয়েছিলাম তবে nextTick
কলগুলি পুনরাবৃত্তি হতে থাকবে এবং ইভেন্ট লুপটিকে পরবর্তী পর্যায়ে অব্যাহত রাখতে দেয় না। এভাবেই nextTick
যখন পুনরাবৃত্তভাবে ব্যবহার করা হয় তখন ব্লক হয়ে যেতে পারে যেখানে setImmediate
পরবর্তী ইভেন্টের লুপে আগুন লাগবে এবং setImmediate
একের মধ্যে থেকে অন্য হ্যান্ডলারটি সেট করা বর্তমান ইভেন্ট লুপকে মোটেই বাধাগ্রস্ত করবে না, ইভেন্ট লুপের স্বাভাবিক পর্যায়ক্রমে পর্যায়ক্রমে চালিয়ে যাওয়ার অনুমতি দেয়।
আশা করি এইটি কাজ করবে!
পিএস - আমি অন্যান্য মন্তব্যকারীদের সাথে একমত যে দুটি কার্যের নামগুলি সহজেই মুছে ফেলা হতে পারে যেহেতু nextTick
এটি বর্তমানের শেষের চেয়ে পরবর্তী ইভেন্ট লুপে জ্বলতে চলেছে এবং বর্তমান লুপটির সমাপ্তি আরও "তাত্ক্ষণিক" "পরবর্তী লুপের শুরুতে। ওহ ভাল, আমরা এপিআই হিসাবে পরিপক্ক হয়ে উঠি এবং লোকেরা বিদ্যমান ইন্টারফেসের উপর নির্ভর করে।