【发布时间】:2020-08-19 20:49:35
【问题描述】:
我一直在玩 Promises,但我无法理解以下代码发生了什么:
const promise = new Promise((resolve, reject) => {
console.log('Promise started - Async code started')
setTimeout(() => {
resolve('Success')
}, 10)
})
setTimeout(() => {
console.log('Promise log inside first setTimeout')
}, 0)
promise.then(res => {
console.log('Promise log after fulfilled')
})
console.log('Promise made - Sync code terminated')
setTimeout(() => {
console.log('Promise log inside second setTimeout')
}, 0)
输出是:
Promise started - Async code started
Promise made - Sync code terminated
Promise log inside first setTimeout
Promise log inside second setTimeout
Promise log after fulfilled
正如预期的那样。
但是让我们检查以下代码的输出:
const promise = new Promise((resolve, reject) => {
console.log('Promise started - Async code started')
setTimeout(() => {
resolve('Success')
}, 1)
})
setTimeout(() => {
console.log('Promise log inside first setTimeout')
}, 0)
promise.then(res => {
console.log('Promise log after fulfilled')
})
console.log('Promise made - Sync code terminated')
setTimeout(() => {
console.log('Promise log inside second setTimeout')
}, 0)
将要解决的承诺 setTimeout 计时器值从 10 毫秒更改为 1 毫秒
输出是:
Promise started - Async code started
Promise made - Sync code terminated
Promise log after fulfilled
Promise log inside first setTimeout
Promise log inside second setTimeout
对此有何解释?
【问题讨论】:
-
Timeouts are throttled。在这种情况下,不同的浏览器(JavaScript 引擎)表现不同。看起来 Chrome 无法区分非常小的延迟和
0。 -
What is minimum millisecond value of setTimeout? 的可能重复项。
1被视为0,在这种情况下,日志再次开始有意义。 -
@Bergi 实际上是
0,在 Chrome 中被视为1。
标签: javascript google-chrome promise settimeout es6-promise