javascript - 奇怪的异步代码行为

标签 javascript node.js asynchronous promise

<分区>

我有一个我无法理解的 Unresolved JS 行为。 我在 node v8.4.0 上运行这段代码。 我运行这段代码两次。

第一次使用 f1() 第二次使用 f2()

f2() 结果符合预期。先打印“开始”,然后打印“结束”。

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

据我所知,结果应该是“开始”然后是“结束”。 我错过了什么?

最佳答案

在使用 setImmediate(() => { console.log('start') }) 的队列之前,将检查具有已解决 Promise 的队列

因为 f1 会立即解析,所以 setImmediate 的回调和已解析的 Promise 同时添加到事件队列中,但处于不同的阶段。 Resolved Promise 的优先级高于使用 setImmediate

添加的回调

如果您使用 process.nextTick,那么回调将被添加为具有更高优先级的 setImmediate 并且 start 将在 之前被记录>结束

function f1() { return new Promise((resolve, reject) => { resolve() }) }

async function main() {
    process.nextTick(() => { console.log('start') })
    setImmediate(() => { console.log('start') })
    await f1()
    console.log('end')
} 

main()

对于f2,文件的读取将涉及一个持续时间更长的异步任务,因此之前仍会调用setImmediat

关于javascript - 奇怪的异步代码行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51918307/

相关文章:

javascript - React 将日期传递为 props : "undefined is not iterable"

javascript - JavaScript 中的变量

node.js - Express.js : How to serve one file for the default "/" route, 然后使用express.static 其余部分?

node.js - Chrome 中的 Sequelize 查询和 PUT 错误问题

Javascript 范围和顺序问题

javascript - 在 Javascript 中查找多维数组的索引

javascript - 在 iframe 前面放置 SVG 而不是 PNG

node.js - Node : http-proxy redirect to available server

javascript - React Hooks、Reducers、Ajax,如何分派(dispatch)新状态

c# - "await"不等待调用完成