nodejs 事件循环 试题思考

这篇文章没有做出很好的解释, 我只是想记录一下关于事件循环的示例(可以思考思考):

开始之前我们先看一下 Promise

语法:

new Promise(executor)

executor 中的代码的是同步执行的

详见: Promise() 构造器


示例一:

给出两段代码思考打印顺序:

;(async () => {
  await console.log(1)
  await console.log(2)
  await console.log(3)
  await console.log(4)
})()

;(async () => {
  await console.log('a')
  await console.log('b')
  await console.log('c')
  await console.log('d')
})()

或者这样:

new Promise((resolve) => {
  resolve()
}).then(() => {
  console.log(1)
}).then(() => {
  console.log(2)
}).then(() => {
  console.log(3)
}).then(() => {
  console.log(4)
})

new Promise((resolve) => {
  resolve()
}).then(() => {
  console.log('a')
}).then(() => {
  console.log('b')
}).then(() => {
  console.log('c')
}).then(() => {
  console.log('d')
})

打印结果:

1
a
2
b
3
c
4
d

示例二:

再来一个 node 中文网 的例子:

const bar = () => console.log('bar')
const baz = () => console.log('baz')
const foo = () => {
  console.log('foo')
  setTimeout(bar, 0)
  new Promise((resolve, reject) => {
    // 这个函数里面的代码是同步执行的
    resolve('应该在 baz 之后、bar 之前')
    console.log('foo 之后')
  }).then(resolve => console.log(resolve))
  baz()
}

foo()

打印结果:

foo
foo 之后
baz
应该在 baz 之后、bar 之前
bar

转到 node中文网 查看事件循环教程 传送门

总结

node.js 事件循环 重要摘取

ES6 作业队列
ECMAScript 2015 引入了作业队列的概念,Promise 使用了该队列(也在 ES6/ES2015 中引入)。 这种方式会尽快地执行异步函数的结果,而不是放在调用堆栈的末尾。

在当前函数结束之前 resolve 的 Promise 会在当前函数之后被立即执行。

有个游乐园中过山车的比喻很好:消息队列将你排在队列的后面(在所有其他人的后面),你不得不等待你的回合,而工作队列则是快速通道票,这样你就可以在完成上一次乘车后立即乘坐另一趟车。

这是 Promise(以及基于 promise 构建的 async/await)与通过 setTimeout() 或其他平台 API 的普通的旧异步函数之间的巨大区别

文献:

MDN 使用 Promise