最好编写不依赖于立即回调的时间(例如微任务与宏任务)的代码,但是暂时不考虑它。
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
是第一次排队。但是,只有现代的浏览器才支持Promises。如果不存在,如何正确填充微任务的特殊功能Promise
?
如果您尝试使用来模仿.then
的微setTimeout
任务,则会排队执行宏任务,而不是微任务,因此,.then
如果已将宏任务排入队列,则填充不良的代码将无法在正确的时间运行。
有一个使用的解决方案MutationObserver
,但它看起来很丑陋,不是什么MutationObserver
用。另外,MutationObserver
IE10及更早版本不支持。如果要在本机不支持Promises的环境中排队微任务,还有其他更好的选择吗?
(我实际上并不是在尝试支持IE10-这只是关于如何在没有Promises的情况下将微任务排队的理论练习)
schedule.js
的历史将是有启发性的。