javascript - Javascript Async 和 Promise 在队列中搞砸了
问题描述
console.log(1)
setTimeout(()=>console.log(2),0)
Promise.resolve(3).then(console.log)
console.log(4)
考虑上面的代码。这是我对代码的期望。
- 1 被注销, setTimeout 是一个异步函数,因此它被添加到队列中。
- 承诺是内联解决的,但在那之后,无论在什么情况下都是
then
异步的。所以它也被添加到队列中。 - 然后 4 被注销并且没有更多的内联代码。
- 因此,setTimeout 将从队列打印 2 和之后的 3 开始执行。
- 因此最终输出应该是 1 4 2 3
但是输出是 1 4 3 2。你能向我解释一下这里实际发生了什么吗?
解决方案
这是因为 Promise 有自己的队列,就像同步和异步操作之间一样。每次 promise 被解决或拒绝时,它的结果都会到达队列的最后。我想说这个例子更清楚地说明了这个案例:
console.log(1)
setTimeout(()=>console.log(2),0)
Promise.resolve(3).then(console.log).then(()=>console.log("three"))
Promise.resolve(5).then(console.log).then(()=>console.log("five"))
console.log(4)
1和4一一出现,因为它是同步操作。然后整个 promises 队列出来了,每个新的“then”都添加到最后。最后,我们得到 setTimeout 结果。
推荐阅读
- javascript - 仅协议方案支持跨源请求。Node.js 服务器 Angular 前端
- php - Slim 框架:不允许方法 不允许方法。必须是以下之一: POST
- java - 关于 log.error 的 PMD 警告是否有解决方案
- excel - 创建一个复制并粘贴到新工作表中的用户表单
- javascript - 无法在 js 中使用 window.location 重定向页面
- foreach - Foreach 循环容器 SSIS
- python - 在 Python 中为 Luis 创建一个 WordListObject 类
- javascript - 使用 JavaScript 将 HTML 中的元素数据保存到 HDD 中的特定文件夹中
- java - Java中的单元测试缺少分支覆盖
- python - 根据 pydoc,“并非所有文件对象都是可查找的”怎么可能?