我注意到在以下代码中:
setTimeout(function(){console.log('setTimeout')});
Promise.resolve(1).then(function(){console.log('promise resolve')})
不管我执行了多少次,承诺回调总是在setTimeout之前记录。
我的理解是,这两个回调都计划在下一个滴答中执行,我也不太明白为什么承诺总是比超时提前。
发布于 2016-08-03 12:09:35
简短的回答承诺比事件循环堆栈中的setTimeout回调函数具有更好的优先级(或者我是如何理解它的)。
很长的答案看这个视频。非常有帮助。希望这能有所帮助。
https://www.youtube.com/watch?v=8aGhZQkoFbQ
感谢@MickJuice为事件循环提供新的和更新的视频。
发布于 2017-09-27 10:50:43
Promise.resolve调度一个微任务,而setTimeout调度一个宏任务。在运行下一个宏任务之前执行这些微任务。
发布于 2019-01-17 15:39:43
超时值、和承诺都可以以异步方式执行代码,但具有不同的特性和目的:
setTimeout --将函数的执行延迟特定时间。-不阻止其余的代码执行(异步行为)-它们创建宏任务(浏览器内部操作)
承诺--它们是允许异步执行代码的包装器(例如: ajax调用)。(不依赖于特定的时间持续时间)--它们对于链接不同的异步调用特别有用。-不阻止其余的代码执行(异步行为)在您使用的等待操作符较少。-他们创建Microtask (浏览器内部操作),该任务优先于宏任务。
推荐
https://stackoverflow.com/questions/38752620
复制相似问题