javascript - 在 Javascript 中,为什么对 `then` Promise 求值 "resolved"方法会返回 "pending"Promise?

标签 javascript asynchronous promise ecmascript-6

以下是 native Javascript 代码:

var first = Promise.resolve(1);
first.then((i)=>console.log(1))

当我在 Chrome 控制台中检查 first 时,它显示其状态为“已解决”

> first
Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: 1}

但是,当我在 Chrome 控制台中检查 first.then((i)=>console.log(1)) 时,它显示其状态为“pending”

> first.then((i)=>console.log(1))
1
Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}

这让我感到困惑,因为我预计 first.then((i)=>console.log(1)) 的状态为 resolved 作为回调then 方法中已经执行并完成。

有人对此有什么想法吗?

最佳答案

Promise.resolve().then(fn) 返回一个尚未解析的新 Promise,但将在当前执行线程展开并完成后的下一个刻度处解析。

因此,如果您立即检查返回的 Promise 是否已解决,则不会。但是,如果您等到下一个刻度,它将被解析,并且 .then() 处理函数将在那时被触发。

解释一下,每次对 .then() 的链式调用都会返回一个链接到前一个 Promise 的新 Promise。而且,根据 Promise A+ 规范,所有 .then() 回调处理程序都会在堆栈展开后异步触发(从技术上讲,它表示“当只有平台代码位于堆栈上时”)。

因此,.then() 立即同步运行。它将您传递给它的回调存储在 Promise 对象中,然后这些回调实际上会在将来的某个时间被异步调用。如果 promise 很快得到解决,那么当当前执行线程完成时,将在下一个“tick”调用完成回调。

这个堆栈在下一个tick上展开和触发是为了让.then()处理程序始终异步触发,无论promise解决的速度有多快。当 Promise 在 1 毫秒或 20 分钟内立即解决时,这允许以一种一致的方式编写调用代码。它们都将在将来的某个时间异步解析,因此调用代码可以对它们进行相同的处理。唯一不同的是从现在起多久它们会被解决或拒绝。

关于javascript - 在 Javascript 中,为什么对 `then` Promise 求值 "resolved"方法会返回 "pending"Promise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36420530/

相关文章:

javascript - 三个 js 补间 js 性能滞后于许多同时补间

javascript - 赋值返回的值

c# - 异步套接字读取 : the initiating thread must not be exited - what to do?

javascript - 使用 async/await 时,Firebase Cloud Firestore 查询返回 Promise { <pending> } 而不是 fulfilled

javascript - 链接多个 Promise(处理回调)

javascript - 使用javascript获取表单名称

javascript - Android webView.loadUrl可以包含jquery函数

c# - 编写一个可以等待的异步进程

jQuery:按顺序加载脚本

javascript - 使用 promise 时的逻辑流程