这篇文章没有做出很好的解释, 我只是想记录一下关于事件循环的示例(可以思考思考):
开始之前我们先看一下 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 的普通的旧异步函数之间的巨大区别
文献: