कोड लिखना बेहतर होता है जो तत्काल कॉलबैक (जैसे कि माइक्रोट्स्क बनाम मैक्रोटस्क) के समय पर निर्भर नहीं करता है, लेकिन चलो उस समय के लिए अलग रख दें।
setTimeout
एक मैक्रोटस्क को कतारबद्ध करता है, जो कि कम से कम, सभी माइक्रोटेस्क (और माइक्रोटेस्क कि वे स्पॉन को पूरा करते हैं) तक शुरू होने का इंतजार करते हैं। यहाँ एक उदाहरण है:
console.log('Macrotask queued');
setTimeout(function() {
console.log('Macrotask running');
});
Promise.resolve()
.then(function() {
console.log('Microtask running');
});
console.log('Microtask queued');
console.log('Last line of script');
एक के व्यवहार .then
एक संकल्प लिया वादा पर तत्काल के व्यवहार से मौलिक रूप से अलग है setTimeout
कॉलबैक - वादा .then
पहले चलेंगे, भले ही setTimeout
पहले कतारबद्ध किया गया था। लेकिन केवल आधुनिक ब्राउज़र वादा का समर्थन करते हैं। यदि मौजूद नहीं है तो माइक्रोटस्क की विशेष कार्यक्षमता को ठीक से कैसे पॉलीफ़िल किया जा सकता Promise
है?
यदि आप .then
का उपयोग करके एक microtask की नकल करने की कोशिश करते हैं setTimeout
, तो आप एक macrotask कतारबद्ध करेंगे, न कि एक microtask, इसलिए बुरी तरह से .then
पॉलीफ़िल्ड सही समय पर नहीं चलेगा अगर एक macrotask पहले से ही पंक्तिबद्ध है।
वहाँ एक समाधान का उपयोग कर रहा है MutationObserver
, लेकिन यह बदसूरत लग रहा है, और क्या MutationObserver
है के लिए नहीं है। इसके अलावा, MutationObserver
IE10 और इससे पहले समर्थित नहीं है। यदि कोई ऐसे वातावरण में माइक्रोटस्क को कतारबद्ध करना चाहता है जो मूल रूप से वादों का समर्थन नहीं करता है, तो क्या कोई बेहतर विकल्प हैं?
(मैं वास्तव में IE10 का समर्थन करने की कोशिश नहीं कर रहा हूं - यह सिर्फ एक सैद्धांतिक अभ्यास है कि कैसे वादे के बिना माइक्रोटेक को कतार में रखा जा सकता है)
schedule.js
पर एक नज़र डालते हुए ज्ञानवर्धक होगा।