আমি মনে করি আমি এটি বেশ সুন্দরভাবে বর্ণনা করতে পারি। যেহেতু 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এটি বর্তমানের শেষের চেয়ে পরবর্তী ইভেন্ট লুপে জ্বলতে চলেছে এবং বর্তমান লুপটির সমাপ্তি আরও "তাত্ক্ষণিক" "পরবর্তী লুপের শুরুতে। ওহ ভাল, আমরা এপিআই হিসাবে পরিপক্ক হয়ে উঠি এবং লোকেরা বিদ্যমান ইন্টারফেসের উপর নির্ভর করে।