setTimeout(function () {
console.log(1)
}, 0);
new Promise(function executor(resolve) {
resolve();
}).then(function () {
console.log(2);
});
如上代码,为什么运行结果是2,1而不是1,2?
不是setTimeout先加入任务队列吗?
setTimeout(function () {
console.log(1)
}, 0);
new Promise(function executor(resolve) {
resolve();
}).then(function () {
console.log(2);
});
如上代码,为什么运行结果是2,1而不是1,2?
不是setTimeout先加入任务队列吗?
10 回答11k 阅读
6 回答2.9k 阅读
5 回答4.7k 阅读✓ 已解决
4 回答3k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
从规范上来讲,
setTimeout
有一个4ms的最短时间,也就是说不管你设定多少,反正最少都要间隔4ms才运行里面的回调(当然,浏览器有没有遵守这个规范是另外一回事儿)。而Promise
的异步没有这个问题。从具体实现上来说,这俩的异步队列不一样,
Promise
所在的那个异步队列优先级要高一些。具体的你可以看这篇文章:从Promise来看JavaScript中的Event Loop、Tasks和Microtasks