Node.js中 Promise和 setTimeOut的队列优先级(堆栈定义理解)

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 之前')
  ).then(resolve => console.log(resolve))
  baz()
}
// 对于上面函数的理解
// 1.首先将所有函数理解成一个三行 一个是打印信息的console.log(),由于按照队列的性质,第一句执行
// 2.在执行第二步时setTimeOut就算延迟时间是0秒也会将回调函数置于消息队列中进而处理下一个代码,此时堆栈调用后然后就退栈了
// 3.然后执行接下来的语句,根据Promise函数的官方文档解释:在当前函数结束之前 resolve 的 Promise 会在当前函数之后被立即执行。
// 对此,在执行当前函数,也就是foo这个函数还没有执行完(因为下面还有一个baz回调函数),需要等当前函数执行完了,什么叫函数执行完了.
// 就是工作队列退栈了,也就是在执行完baz()这个函数后,工作队列执行完了,因此调用Promise去执行其代码.
// 但有一点很关键的是,setTimeout这个函数中的bar函数还没有执行,这就是消息队列的由来,根据官方文档在执行完工作队列后,在根据promise的优先
// 在最后到消息队列退栈了,整个过程才结束,注意:事情的发展是这样的 打印foo->去执行setTimeOut这个函数->去执行baz函数->foo函数执行完毕
// 执行promise内的resolve函数->在执行bar函数.

这段代码的运行结果为:

Node.js中 Promise和 setTimeOut的队列优先级(堆栈定义理解)_第1张图片

 

 在学习Node.js中遇到的一些问题,对这些代码非常不理解其执行顺序,后面查阅官方文档,仔细阅读后,才发现是这样子;

对于上面函数的理解

1.首先将所有函数理解成一个三行 一个是打印信息的console.log(),由于按照队列的性质,第一句执行

2.在执行第二步时setTimeOut就算延迟时间是0秒也会将回调函数置于消息队列中进而处理下一个代码,此时堆栈调用后然后就退栈了

3.然后执行接下来的语句,根据Promise函数的官方文档解释:

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

对此,在执行当前函数,也就是foo这个函数还没有执行完(因为下面还有一个baz回调函数),

需要等当前函数执行完了,

什么叫函数执行完了?

根据官方文档的理解:我得出一个推论:就是指工作队列退栈了,(注意而不是指全队列退栈,因为后面会有一个消息队列,见下)

也就是在执行完baz()这个函数后,工作队列执行完了,因此调用Promise去执行其代码.

但有一点很关键的是,setTimeout这个函数中的bar函数还没有执行,这就是消息队列的由来,根据官方文档在执行完工作队列后,在根据promise的优先级

在最后到消息队列退栈了,整个过程才结束,注意:事情的发展是这样的 打印foo->去执行setTimeOut这个函数->去执行baz函数->foo函数执行完毕执行promise内的resolve函数->在执行bar函数.

 

因此 为了验证上述结果,我自己手动创建了一个bay函数,结果说明我的想法是对的

Node.js中 Promise和 setTimeOut的队列优先级(堆栈定义理解)_第2张图片

2022 08 04 代码路上有我不孤单

 

你可能感兴趣的:(node.js,javascript,前端)