JavaScript fetch API - 为什么response.json()返回一个promise对象(而不是JSON)?

mic*_*ech 17 javascript json asynchronous

我刚刚开始学习Fetch API:https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch

这是我编写的代码片段,用来修补它:

fetch('http://swapi.co/api/people/1')
  .then(function(response) {
    var json = response.json();

    console.log(json);
    // Expected : { "name": "Luke Skywalker","height": "1.72 m", ... } 
    // Get : Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
  }); 
Run Code Online (Sandbox Code Playgroud)

我本来希望从response.json()中获取一个JSON对象.

与使用JSON.parse()时获得的内容类似.

相反,我得到了一个承诺对象.

如果我扩大这里显示的承诺链......

return response.json().then(function(json) {
      // process your JSON further
});
Run Code Online (Sandbox Code Playgroud)

...然后它工作:在以下承诺的then方法中,它显示为json.

为什么我不能在第一个promise的then()中检索JSON数据?

谁能请解释这里发生了什么?

我真的很感激.

dee*_* zg 16

因为response.json()返回另一个promise(在你的函数体内)

https://developer.mozilla.org/en-US/docs/Web/API/Body/json

  • 好吧,原因很简单:当你有异步,可能长时间运行时,你使用promises.在你的情况下有2个这样的动作:1)fetch(获取可能需要很长时间的网络资源并在完成后将其重新分配到Response)和2).json()获取Response流并在完成后将其解析为json对象(也可能很长).因为两者都使用promises,如果你想使用他们解决的对象,你需要.then(). (4认同)
  • 惊人的。谢谢,至少解释了这种行为。然后我必须调用另一个 then 以获得第二个承诺的结果。我只是问自己,所有这些嵌套有什么好处? (2认同)
  • 这肯定是出乎意料的,因为有关此行为的问题数量以及其他库如何处理ajax/rest api调用.用户跳跃是一个不必要的障碍. (2认同)