javascript - 当我在 Promise 上调用 Promise.resolve() 时会发生什么(从事件循环的角度来看)?
问题描述
这是简化的代码结构:
new Promise(resolve => {
resolve(new Promise(resolve => resolve(1)))
}).then(() => {
console.log('tick 3')
}).then(() => {
console.log('tick 4')
})
new Promise(resolve => resolve(1)).then(() => {
console.log('tick 1')
}).then(() => {
console.log('tick 2')
})
控制台日志:
tick 1
tick 2
tick 3
tick 4
我的问题是,为什么记录的回调函数tick 3
执行 2 个“tick”(或事件循环,不确定如何正确描述)比记录的回调晚tick 1
而不是仅 1 个“tick”?如果函数只比函数tick 3
晚执行 1 个“tick” ,则应该比它更早进入任务队列更早记录。tick 1
tick 3
tick 2
我尝试像这样在 MDN 上查找文档:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve ,但只发现这句话与我的问题有关,其中显然在这里没有帮助:
该
Promise.resolve()
方法返回一个用给定值解析的 Promise 对象。如果该值是一个承诺,则返回该承诺。
那么当 Promise.resolve() 收到一个 Promise 时,到底发生了什么?提前致谢。
解决方案
这样想:
Promise.resolve = (value) => {
if (value instanceof Promise) return value;
return new Promise(resolve => resolve(value));
}
如果你向它传递一个承诺,它只会返回承诺。如果你传递一个非承诺,它会将它包装在一个用该值解析的承诺中。
推荐阅读
- html - 无法在css的下拉菜单中获得全宽
- ubuntu-18.04 - NFS 内核服务器活动但已退出状态
- java - 客户端可以负责按需创建由 HikariCP(或其他池解决方案)管理的 java.sql.Connnection 吗?
- java - 有没有办法在无限滚动网站上用硒捕获“div”元素?
- python - python:修改参数而不创建新对象
- html - 如何比较来自firebase的两个字符串的总和
- android - NativeScript HTTP 获取请求不起作用。安卓版本问题?
- javascript - 创建一个读取文本并使用它的 API
- c# - 我想创建 get 方法来从我的 mongo 服务器返回原始 bson 文档,而不将它们映射到具有特定字段的模型
- javascript - 设置状态后无法发送响应