【发布时间】:2019-01-25 20:22:54
【问题描述】:
我有一个无法理解的未解决的 JS 行为。
我在node v8.4.0 上运行此代码。
我正在运行此代码两次。
第一次使用f1()
第二次使用f2()
f2() 结果符合预期。先打印'start',然后打印'end'。
f1() 结果不符合预期。先打印'end',然后打印'start'。
有人可以向我解释一下下面代码的结果吗?
const fs = require('fs')
function f1() { return new Promise((resolve, reject) => { resolve() }) }
function f2() {
return new Promise((resolve, reject) => {
fs.readFile('/Users/adi/Downloads/profile.jpg', resolve)
})
}
async function main() {
setImmediate(() => { console.log('start') })
await f1()
console.log('end')
}
main()
//f1 output:
end
start
//f2 output:
start
end
据我所知,结果应该是“开始”,然后是“结束”。 我错过了什么?
【问题讨论】:
-
我想知道
Promise构造函数是否正在简化结果。 -
那么,您真正要问的是
setImmediate()和.then()处理程序之间的竞争,即立即解决的承诺?答案是因为不同的异步事物(如setImmediate()和 Promise)被编码为工作(微任务)的内部机制。如果您关心两者之间的顺序,请为特定顺序编写代码,而不是依赖该级别的内部设计细节。 -
setImmediate不幸地被命名为 very,它做任何事情但立即运行代码 - 它实际上在 之后运行它> 所有微任务(promises 和 await)和 afternextTick(它不会在下一个滴答时运行,而是一个微任务)
标签: javascript node.js asynchronous promise