以下是 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/