当我在控制台中运行下面的代码时,我得到的输出是:"Promise 1 "和 "end"。
"start"
"Promise 2"
"end"
"Promise 1"
console.log("start");
Promise.resolve().then(
() => console.log("Promise 1")
).then(console.log("Promise 2"));
console.log("end");
谁能给我解释一下为什么 "承诺2 "被打印在 "承诺1 "和 "结束 "之前?
的参数 .then()
应该是一个函数。但你写道 .then(console.log("Promise 2"))
和 console.log("Promise 2")
是一个函数调用,而不是一个函数。它是立即执行的,所以日志信息是立即显示的,而不是在解决承诺的时候。
把它改成一个函数,就像你周围的 console.log("Promise 1")
,它们将按照预期的顺序执行。
console.log("start");
Promise.resolve().then(
() => console.log("Promise 1")
).then(() => console.log("Promise 2"));
console.log("end");
end
因为承诺的解析是异步的,所以首先被记录下来。
如前所述,你应该将 console.log
作为一个函数,让它以正确的顺序运行。
至于为什么要用 end
首先显示,这是因为事件循环将确保调用堆栈是空的,并且所有的全局执行都已完成,然后才会检查微任务队列(有时也称为作业队列),你的控制台日志就放在那里,等待被添加到调用堆栈中。
这是关于优先级(按优先级降序排列)。
该 start
和 end
是在执行的全局线程中,所以将首先运行。然后,事件循环将添加 Promise 1
和 Promise 2
日志,并在所有全局执行结束后运行它们。最后,如果微任务队列是空的,事件循环将检查任务队列(如 setTimeout
在这里得到补充)。)
希望能帮到你。