我正在尝试使用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
语法。
答案 0 :(得分:3)
这很简单:调度fetch()
请求时,它返回一个包含响应的Promise。这由第一个.then()
解决。解决这个第一个承诺实际上会返回Response
。
现在这是棘手的部分:读取响应正文的方法,例如.json()
,.text()
,.blob()
。...所有返回的诺言< / strong>。这意味着您将需要解析第二个Promise才能获得解析后的响应。
流程如下:
fetch()
请求,并返回一个Response
类型的Promise。.json()
返回一个对象,.text()
返回字符串,{{ 1}}返回Blob)。答案 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"