【问题标题】:How do I resolve an infinite Javascript promise?如何解决无限的 Javascript 承诺?
【发布时间】:2017-12-29 06:36:42
【问题描述】:

我正在使用 Apollo GraphQL 库,并且在某一时刻它返回了一个承诺。当我在控制台中检查它时,我可以看到它是一个已解决的承诺:

Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: Object}
__proto__
:
Promise
[[PromiseStatus]]
:
"resolved"
[[PromiseValue]]
:
Object

然而,当我Promise.resolve(thatPromise) 我回来了......同样的承诺。无论我解决多少次promise,它都会不断返回一个promise,从而无法访问promise的值。

我知道值在那里(如果我检查 [[PromiseValue]] 它是一个带有值的普通对象)......我只是不知道如何在代码级别而不是在浏览器控制台中获取它。

有没有人遇到过这样的事情,如果有的话,你能弄清楚如何提取这种无限解决的承诺的价值吗?

附:我确实尝试过:

thatPromise['[[PromiseValue]]'];

但它似乎是一个特殊的浏览器值,您无法从代码中访问。

附言刚刚意识到这可能是也可能不是一个承诺。我通过调用response.clone().json() 得到它,所以虽然它看起来像一个承诺,但它可能只是一个承诺的克隆,在这种情况下,这可以解释为什么我无法解决它。但是,它没有解释我如何提取值。

编辑

我认为这里发生了一些奇怪的事情,我没有报告所有相关细节。一旦我把事情整理得更好,就会发布更多信息(不想让任何人胡思乱想)。

【问题讨论】:

  • 我对您的尝试感到有些困惑。 'Promise.resolve(thatPromise)' 应该返回你传入的内容。它不解决参数 - 它创建一个立即解决参数的承诺。因此,如果你通过它一个承诺,你会得到一个承诺。
  • 我认为因为它是一个承诺(或其他东西)的克隆,所以 Promise.resolve 只是返回值本身......它以某种方式包装了一个像 Promise 一样的值,但不像 Promise 那样可解析。
  • No Promise.resolve() 不返回原始值,它返回一个承诺。看这里:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 祝你好运!希望你能弄清楚。
  • 呃猜我不能删除;而是留下了编辑评论。

标签: javascript promise apollo react-apollo


【解决方案1】:

您没有理由必须致电Promise.resolve 来获取价值。请记住,Promises 是异步的。您必须像这样访问它的值:

myPromise.then(value => {
  console.log(value)
  // do whatever you're going to do with value
};

您可以在 [此处][1] 阅读有关 Promise 工作原理的更多信息。

【讨论】:

  • 是的,但如果这是我调用Promise.resolve 的已解决承诺,则不需要then。我想我不知何故有一个奇怪的克隆,看起来像一个承诺,但不是什么的。
  • Promise.resolve() 将始终返回一个 Promise。检查文档here。你不会调用 Promise.resolve 来读取一个 Promise,而是创建一个已经解决的新 Promise。
  • 是的,对不起;我应该说的是,即使我Promise.resolve(response).then(x =>x) 然后x 仍然是一个承诺。
  • 没关系,我想我只是被控制台弄糊涂了。涉及一些细节,但您的回答基本上是正确的(如果我在克隆之前执行.then,我可以访问该值)。谢谢。
猜你喜欢
  • 2019-05-09
  • 1970-01-01
  • 2020-09-07
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多