gpt4 book ai didi

javascript - 为什么当存在键名为 "then"的对象时,promise 处于挂起状态

转载 作者:行者123 更新时间:2023-11-29 10:56:42 26 4
gpt4 key购买 nike

JavaScript 在下面的情况下运行异常。

我看到了这个答案并得到了关于 Javascript 的奇怪行为的问题:https://stackoverflow.com/a/50173415/1614973

我发现,如果我们将他的代码中的 then 更改为任何其他键名,我们将得到完全不同的结果。CodePen演示:his , changed

我试过 Chrome 和 Firefox,它们都有这个问题。我探索了那里的问题,并找到了这个“错误”的一些基本规则。

// This one will always pending
const pendingPromise = Promise.resolve(x=>x).then(r => ({ then: y => 0 }));
pendingPromise.then(r => console.log("promise resolved")); // "promise resolved" will never logged

// Thanks @Jaromanda X's correction. a simpler version is:
const pendingPromise1 = Promise.resolve().then(() => ({then: y => 0}))
pendingPromise1.then(r => console.log("promise1 resolved")); // "promise1 resolved" will never logged

pendingPromise 永远挂起。据我所知,可以通过三件事来切换此错误:

  1. 原来的必须要有功能。(不必要的约束)
  2. .then 中,必须返回一个名为“then”的键的对象。
  3. then 的值必须是一个函数。

我想知道为什么会发生这种情况。

最佳答案

它永远不会解决的原因是因为你最后的“然后”从不调用解决:

.then(r=>({then: y => 0})) 只返回一个非 thenable 的 0

y 是解析回调。要使您的代码正常工作,请将 y 更改为 resolve 然后调用它。或者,只需调用 y。重点是,在调用 resolve 之前,promise 保持未决状态。

console.log("Starting Strange Promise")
const pendingPromise = Promise.resolve(x=>x).then(r=>(
{then: y => "Strange Promise Done!"}
));
pendingPromise.then(console.log) // never happens

console.log("Starting Hacked Promise")
const hackedPromise = Promise.resolve(x=>x).then(r=>(
{then: resolve => resolve("Hacked Promise Done!")}
));
hackedPromise.then(console.log) // happens, like, speed of light quickly

关于javascript - 为什么当存在键名为 "then"的对象时,promise 处于挂起状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55768878/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com