এই দুটিয়ের মধ্যে পার্থক্য কী এবং আমি কখন অন্যটির উপরে ব্যবহার করব?
এই দুটিয়ের মধ্যে পার্থক্য কী এবং আমি কখন অন্যটির উপরে ব্যবহার করব?
উত্তর:
সেটটাইমআউট হ'ল বিলম্ব শেষ হওয়ার পরে ফাংশনটি কল করার মতো। যখনই কোনও ফাংশন বলা হয় এটি তাত্ক্ষণিকভাবে কার্যকর করা হয় না, তবে সারিবদ্ধ করা হয় যাতে এটি কার্যকর করা হয় এবং বর্তমানে সারিবদ্ধ ইভেন্টহ্যান্ডাররা প্রথমে শেষ হওয়ার পরে এটি কার্যকর করা হয়। সেটটাইমআউট (, 0) এর অর্থ বর্তমান কাতারে উপস্থিত সমস্ত কার্য সম্পাদনের পরে কার্যকর করা হয়। এটি কতটা সময় নিতে পারে সে সম্পর্কে কোনও গ্যারান্টি দেওয়া যায় না।
সেটআইমিডিয়েট এটি ফাংশনের সারি ব্যবহার না করে ব্যতীত এই ক্ষেত্রে অনুরূপ। এটি I / O ইভেন্টহ্যান্ডলারের সারি পরীক্ষা করে। যদি বর্তমান স্ন্যাপশটের সমস্ত আই / ও ইভেন্টগুলি প্রক্রিয়া করা হয় তবে এটি কলব্যাকটি কার্যকর করে। এটি শেষ আই / ও হ্যান্ডলারের কিছুক্ষণের মতো প্রক্রিয়া.এনেক্সটটিকের সাথে সাথেই তাদের সারি করে। সুতরাং এটি দ্রুত।
এছাড়াও (সেটটাইমআউট, 0) ধীর হবে কারণ এটি নির্বাহের আগে কমপক্ষে একবার টাইমারটি পরীক্ষা করবে। অনেক সময় এটি দ্বিগুণ হয়ে যেতে পারে। এখানে একটি মানদণ্ড দেওয়া হল।
var Suite = require('benchmark').Suite
var fs = require('fs')
var suite = new Suite
suite.add('deffered.resolve()', function(deferred) {
deferred.resolve()
}, {defer: true})
suite.add('setImmediate()', function(deferred) {
setImmediate(function() {
deferred.resolve()
})
}, {defer: true})
suite.add('setTimeout(,0)', function(deferred) {
setTimeout(function() {
deferred.resolve()
},0)
}, {defer: true})
suite
.on('cycle', function(event) {
console.log(String(event.target));
})
.on('complete', function() {
console.log('Fastest is ' + this.filter('fastest').pluck('name'));
})
.run({async: true})
আউটপুট
deffered.resolve() x 993 ops/sec ±0.67% (22 runs sampled)
setImmediate() x 914 ops/sec ±2.48% (57 runs sampled)
setTimeout(,0) x 445 ops/sec ±2.79% (82 runs sampled)
প্রথমটি দ্রুততম কলগুলির ধারণা দেয়। সেটটাইমআউটটিকে অন্যান্য হিসাবে যতবার অর্ধেক কল করা হয় আপনি তা পরীক্ষা করে দেখতে পারেন। এছাড়াও মনে রাখবেন সেটইমিডিয়েট আপনার ফাইল সিস্টেম কলগুলিতে সামঞ্জস্য করবে। সুতরাং লোড অধীনে এটি কম সঞ্চালন করবে। আমি মনে করি না সেটটাইমআউট আরও ভাল করতে পারে।
সেটটাইমআউট কিছু সময়ের পরে ফাংশনগুলি কল করার একটি অনাহু উপায়। এটি ব্রাউজারের মতোই। এটি সার্ভার-সাইডের জন্য উপযুক্ত নাও হতে পারে (ভাবুন কেন আমি বেঞ্চমার্ক.জেএসটি সেটটাইমআউট ব্যবহার করে না)।
ইভেন্ট লুপ কীভাবে কাজ করে এবং কিছু ভুল ধারণা পরিষ্কার করে দেয় সে সম্পর্কে একটি দুর্দান্ত নিবন্ধ। http://voidcanvas.com/setimedia-vs-nexttick-vs-settimeout/
নিবন্ধটি উদ্ধৃত:
setImmediateআই / ও ক্যু কলব্যাকস সমাপ্ত বা সময়সীমা শেষ হওয়ার পরে কলব্যাকগুলি কল করা হয়। সেটআইমিডিয়েট কলব্যাকগুলি চেক কাতারে স্থাপন করা হয়, যা I / O সারি পরে প্রক্রিয়া করা হয়।
setTimeout(fn, 0)কলব্যাকগুলি টাইমার কাতারে স্থাপন করা হয় এবং I / O কলব্যাকের পাশাপাশি কুইউ কলব্যাকগুলি চেক করা হবে। ইভেন্ট লুপ হিসাবে, প্রতিটি পুনরাবৃত্তির মধ্যে টাইমার কাতারে প্রথমে প্রক্রিয়া করুন, যার ফলে প্রথমে কোনটি কার্যকর করা হবে তা কোন ফেজ ইভেন্ট লুপটির উপর নির্ভর করে।
সেটআইমিডিয়েট () হ'ল আই / ও ইভেন্ট কলব্যাকের পরে এবং সেটটাইমআউট এবং সেটইন্টারভাল এর আগে কলব্যাকের তাত্ক্ষণিক সম্পাদনের সময়সূচী।
সেটটাইমআউট () হ'ল বিলম্ব মিলিসেকেন্ডের পরে ওয়ান-টাইম কলব্যাকের সম্পাদনের সময়সূচী।
দলিলগুলি এটাই বলে।
setTimeout(function() {
console.log('setTimeout')
}, 0)
setImmediate(function() {
console.log('setImmediate')
})
আপনি যদি উপরের কোডটি চালান, ফলাফলটি এরকম হবে ... যদিও বর্তমান ডকটি বলেছে যে "I / O ইভেন্ট কলব্যাকের পরে এবং সেটটাইমআউট এবং সেটইন্টারভাল এর আগে কলব্যাকের" তাত্ক্ষণিক "সম্পাদনের সময়সূচী করার জন্য"। ..
ফলাফল..
সেটটাইমআউট
সেটআইমিডিয়েট
আপনি যদি নিজের উদাহরণটি অন্য টাইমারে মুড়ে রাখেন তবে এটি সর্বদা সেটটাইমেট সেটআপ টাইমআউট দ্বারা প্রিন্ট করে।
setTimeout(function() {
setTimeout(function() {
console.log('setTimeout')
}, 0);
setImmediate(function() {
console.log('setImmediate')
});
}, 10);
সর্বদা ব্যবহার করুন setImmediate, যদি না আপনার সত্যিই নিশ্চিত যে আপনার প্রয়োজন setTimeout(,0)(তবে আমি কল্পনাও করতে পারি না, কীসের জন্য)। প্রথম টিক এবং কলব্যাকে কল করা ব্যতীত setImmediateকলব্যাক প্রায়শই আগে কার্যকর করা হবে willsetTimeout(,0)setImmediate
setTimeoutযেতে যেতে হবে, setImmediateযখন প্রয়োজনীয় দেখানো হবে তখনই এটি ব্যবহার করা উচিত।
সরবরাহকৃত উত্তরের সাথে সম্পূর্ণ অসন্তুষ্ট। আমি যা মনে করি সেগুলি এখানে আরও ভাল উত্তর পোস্ট করেছি: https://stackoverflow.com/a/56724489/5992714
প্রশ্নগুলি একটি মূল নকল যা মূল মডিউলে ব্যবহৃত হয় সেটটাইমআউট (0) এবং সেটআইমিডিয়েট () অপরিবর্তিত কেন?
আমি মনে করি নব্যা এস এর উত্তর সঠিক নয়, এখানে আমার পরীক্ষার কোডটি রয়েছে:
let set = new Set();
function orderTest() {
let seq = [];
let add = () => set.add(seq.join());
setTimeout(function () {
setTimeout(function () {
seq.push('setTimeout');
if (seq.length === 2) add();
}, 0);
setImmediate(function () {
seq.push('setImmediate');
if (seq.length === 2) add();
});
}, 10);
}
// loop 100 times
for (let i = 0; i < 100; i++) {
orderTest();
}
setTimeout(() => {
// will print one or two items, it's random
for (item of set) {
console.log(item);
}
}, 100);
ব্যাখ্যা এখানে
সেটটাইমআউট (এফএন, 0) বিপুল আপডেটে ব্রাউজারকে হিমাঙ্ক থেকে রোধ করতে ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ ওয়েবসকেট.অনমেজেজে আপনার এইচটিএমএল পরিবর্তন হতে পারে এবং বার্তা যদি আসতে থাকে তবে সেটআইমিডিয়েট ব্যবহার করার সময় ব্রাউজার হিমশীতল হতে পারে
এগুলি গভীরভাবে বুঝতে দয়া করে ইভেন্টের লুপ পর্যায়ক্রমে একবার যান।
সেটআইমিডিয়েট: এটি "চেক" পর্যায়ে কার্যকর হয়। চেক ফেজ ইনপুট / আউটপুট পর্যায়ের পর বলা হয়।
সেটটাইমআউট: এটি "টাইমার" পর্যায়ে কার্যকর হয়। টাইমার ফেজ প্রথম দফায় কিন্তু পরে বলা হয় , I / O ফেজ সেইসাথে চেক ফেজ।
নির্ধারিত পদ্ধতিতে আউটপুট পেতে, ইভেন্ট-লুপটি কোন ধাপের উপর নির্ভর করবে; তদনুসারে, আমরা দুটি মধ্যে ফাংশন ব্যবহার করতে পারেন।