Javascript .then() 函数检查网络中的承诺 api

does Javascript .then() function check for the promise in a web api

感谢您阅读本文。

我真的很难完全理解异步编程在 Javascript 中的工作原理。 想象一下这段代码:

Promise.resolve().then(randomcallback)

所以在这种情况下,我认为会发生以下情况:首先,在正常的调用堆栈中,Promise.resolve() 函数会立即解析一个 Promise 对象并 return 它。然后,.then() 函数检查 promise 是否已解决,如果是,它将 randomcallback 函数添加到微任务队列中,当调用堆栈为空时,该队列将被执行,并且 return 是一个新的 promise 对象。 但是想象一下,如果我们不是在已解析的 promise 对象上调用 .then() 函数,而是在未决对象上调用它。 then 函数如何检查 Promise 对象何时被解析?它是否像某些事件侦听器一样不断检查某些 Web api 线程(因为程序的其余部分可以 运行 打开)状态 属性 更改为 fulfilled 然后传递回调对微任务队列起作用?

async await 也一样,当 promise 得到解决时,await 关键字是否只是联系一些网络 api 来监听?如果是这样,如果承诺对象已经在开始时解析(其中没有设置超时),它仍然会这样做吗? 如果您使用:

randomunresolvedpromise.then(randomcallback)

假设 randomunresolvedpromise 在 3 秒内完成(当调用堆栈为空时) .then 函数是如何执行的(我也查看了库的源代码,但它真的很混乱,因为它使用了这么多回调函数)因为程序字面上保持 运行ning 并且 randomresolvedpromise 只得到满足当堆栈为空时,该函数是否也只是在某种网络中等待 api 或什么?

我真的看过很多视频,读过很多文章,但它们似乎并没有触及使用 Promises 和 async and await 时事件循环中真正发生的事情。 这一切都让我感到困惑,我希望我的问题真的有意义。 非常感谢任何答案,谢谢!

How is the then function able to check when the Promise object is resolved?

没有。 then 方法将回调放入承诺的实现回调列表中,然后它的工作就完成了。稍后,当实现承诺时, 代码(实现承诺)将调用微任务队列中的承诺实现回调。 (你是对的,虽然当调用 then 时承诺已经实现时它是 then。)

await 的工作方式相同,因为 await 只是 then 的语法糖。 (不过,“只是”跳过了 很多 的细节。:-D )


旁注:您会注意到我说的是“履行回调”,而不是“解决回调”,并且指的是 fulfilled 的承诺(不是 resolved )。 “fulfilled”和“resolved”之间有很大的区别,但不幸的是,它并没有被很好地理解,人们使用“resolve”的意思是“fulfill”lot。参见 my blog post here (which the MDN folks linked from their documentation) for the difference (and why it matters). (That said, if you say you "resolve the promise with X" and X isn't a promise or other thenable,这基本上是“用 X 履行承诺”的同义词。当 X 是一个 promise 或其他 thenable 时,情况就不是这样了。)

考虑以下代码示例:

promise1
  .then(() => console.log("foo")
  .then(() => console.log("bar"))

在上面的代码示例中,我们有 3 个承诺:promise1promise1.then()promise1.then().then()。 (我们分别命名为p1p2p3)。

我们假设 p1 需要 3 秒才能完成。执行上述代码后,两个 then 方法将一个接一个地被调用,将它们的回调添加到包含 then() 方法的承诺的实现回调的内部列表被称为.

因此,p1.then() 将在 p1 的内部实现回调列表中添加 () => console.log("foo")。 同样,p1.then().then() 会将 () => console.log("bar") 添加到 p2.

的内部实现回调列表中

记住所有这一切发生在之前 p1 完成我们假设需要 3 秒。此时,所有的承诺:p1p2p3都处于pending状态。

p1 --> pending
p2 --> pending
p3 --> pending

一旦 p1 完成,作业将在 micro-task 队列中排队以执行传递给 p1.then() 的回调。此时,我们有:

p1 --> settled (fulfilled)
p2 --> pending
p3 --> pending

(承诺在履行或拒绝时被认为已经解决)

执行传递给 p1.then() 的回调后,p1.then() 返回承诺,即 p2 实现;结果,另一个作业在 micro-task 队列中排队以执行传递给 p1.then().then().

的回调

现在我们有:

p1 --> settled (fulfilled)
p2 --> settled (fulfilled)
p3 --> pending

现在,与 p2 一样,p3 将在执行传递给 p1.then().then() 的回调后完成,但 p3 没有完成处理程序。结果,没有工作会被排队,因为没有什么可做的来响应 p3.

的实现
p1 --> settled (fulfilled)
p2 --> settled (fulfilled)
p3 --> settled (fulfilled)