我能以某种方式在第一个“ then”中获取获取响应吗?

时间:2018-08-29 18:48:55

标签: javascript es6-promise fetch-api

我正在尝试使用Fetch API。从示例看来,一个GET请求需要一个then才能以某种方式解析响应。

目前我正在这样做

fetch(url)
    .then(response => response.json())
    .then(response => {
        console.log(response);  
    });

但是第一个then似乎很简单。我试图避免这种情况,例如:

fetch(url)
    .then(response => {
        console.log(response.json());  
    });

但这会记录状态Promise的待定resolved

我阅读了有关此主题的其他问题,并阅读了一些有关诺言的信息,但我不知道是否有可能将其合并为一个then(如果可以,如何?)。

例如,答案here中的两个指出了这一点

  

不需要使用多个'.then'

  

没有充分的理由拥有两个.then()处理程序,因为每个处理程序中的代码都可以组合成一个.then()处理程序

但是我无法使该示例真正起作用-我仍然有一个承诺:)

相反,被接受的答案here解释了.then实际上对结果有作用(提取了诺言的回报),但我无法确定自己是否可以这样做,说response.json().then()response.json().getVal()还是唯一的双then语法。

3 个答案:

答案 0 :(得分:3)

这很简单:调度fetch()请求时,它返回一个包含响应的Promise。这由第一个.then()解决。解决这个第一个承诺实际上会返回Response

现在这是棘手的部分:读取响应正文的方法,例如.json().text().blob()。...所有返回的诺言< / strong>。这意味着您将需要解析第二个Promise才能获得解析后的响应。

流程如下:

  1. 发出一个fetch()请求,并返回一个Response类型的Promise。
  2. 当您尝试解析响应的内容时,它将返回第二个Promise,其类型取决于您使用的方法(例如.json()返回一个对象,.text()返回字符串,{{ 1}}返回Blob)。
  3. 解决第二个Promise,您将获得实际的已分析响应正文

答案 1 :(得分:2)

fetch返回的第一个承诺在某些情况下会很有用。如果您想避免样板,可以简单地创建自己的函数:

function fetch_json(url, opts) {
    return fetch(url, opts)
        .then(resp => resp.json());
}

fetch_json(your_url)
    .then(json => console.log(json));

答案 2 :(得分:1)

这些天,我使用的是async / await语法,这是相同的东西,但对我来说却看起来像样板。

java -jar "/home/…/Cubyz alpha 0.6.0: The Enlightened Update/main.jar"