【问题标题】:fetch res.json continues to return unresolved promisefetch res.json 继续返回未解决的承诺
【发布时间】:2026-01-09 06:25:05
【问题描述】:

我期待这个:

fetch('https://response.democratsabroad.org/photos/?tag=alex')
    .then(res=>res.json())
    .then(res=>console.log(res))

返回一个 json 对象。相反,它返回一个未决的承诺。

Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}

screenshot of javascript console 为什么它会传递未解决的承诺而不是已解决的值?

【问题讨论】:

  • 那么为什么.then(res=>res.json()) 会返回一个带有值的对象,但继续使用.then(res=>console.log(res)) 是未定义的?或者我在问,我需要做些什么来控制台记录最终在 .then(res=>res.json()) 中解析的 json 对象
  • No 'Access-Control-Allow-Origin' header is present on the requested resource., Uncaught (in promise) TypeError: Failed to fetch
  • @JaromandaX 您发布的 URL 重定向到 URL 中第一个 . 之后的部分,在该部分无法重现 OP 中描述的结果
  • 刚刚将 cors 更新为 access-control-allow-origin 所以现在它应该适合你了。数据在浏览器或邮递员中加载,而不是在 fetch 中。
  • @AlexMontgomery“为谁工作”?

标签: javascript json promise fetch-api


【解决方案1】:

首先,如果您还不知道这一点,只要您直接在控制台中运行一行代码,控制台就会打印出该行代码的计算结果。如果该行代码是一个函数调用或一系列函数调用,如fetch(...).then(...).then(...),那么控制台将显示该函数链返回的内容。它不会等待 promise 解决或回调被调用,它只是执行那行代码并报告它返回的内容。

并且,fetch().then()fetch().then().then() 返回处于挂起状态的承诺。这就是它的作用。然后,稍后当fetch() 操作完成时,第一个promise 将完成并调用它的.then() 处理程序。

但是,如果您只是查看控制台中的 fetch().then()fetch().then().then() 返回的内容,它总是会返回处于挂起状态的未解决的 Promise,因为异步操作尚未完成,所以这就是返回控制台将显示的值。

您使用了 Promise,因此它们将在未来的适当时间执行其 .then() 处理程序。因此,如果您想查看异步操作的结果,您应该记录传递给 .then() 处理程序的内容,然后在调用它们时,您将看到记录的相应数据。

注意:您还应该在链的末尾有一个 .catch() 处理程序,这样您就可以看到您的承诺链中发生的任何错误。

【讨论】: