fetch()。then()返回内容类型和主体

时间:2018-08-22 17:57:41

标签: javascript promise fetch

互联网上的每个提取API示例都展示了如何使用response.json(),response.blob()等仅返回正文。 我需要的是同时调用内容类型和主体作为blob的函数,但我不知道该怎么做。

fetch("url to an image of unknown type")
  .then((response) => {
    return {
      contentType: response.headers.get("Content-Type"),
      raw: response.blob()
  })
  .then((data) => {
    imageHandler(data.contentType, data.raw);
  });

这显然行不通:data.contentType已填充,但data.raw是一个承诺。如何在相同的上下文中获得两个值?

3 个答案:

答案 0 :(得分:5)

您可以这样写:

ParseException

或者这样

java.text.ParseException: Unparseable date: "5 июн 18, 21:56"
    at java.text.DateFormat.parse(DateFormat.java:366)
    at ru.job4j.ConnectionWeb.getTimeAdding(ConnectionWeb.java:179)
    at ru.job4j.ConnectionWeb.main(ConnectionWeb.java:192)

在这两种情况下,您都将在保持对fetch("url to an image of unknown type") .then(response => { return response.blob().then(blob => { return { contentType: response.headers.get("Content-Type"), raw: blob } }) }) .then(data => { imageHandler(data.contentType, data.raw); }); 的访问权限的范围内保留接收已解析的fetch("url to an image of unknown type") .then(response => { return response.blob().then(blob => { imageHandler(response.headers.get("Content-Type"), blob) }) }) 的回调。

答案 1 :(得分:1)

等待blob然后创建对象:

fetch("url to an image of unknown type")
.then(response => {
  return response.blob()
  .then(raw => ({
    contentType: response.headers.get("Content-Type"),
    raw
  }));
).then(data => imageHandler(
  data.contentType,
  data.raw
));

答案 2 :(得分:1)

如果允许您使用async函数,则最佳解决方案是使用async/await

async function fetchData() {
    const res = await fetch('url');
    const contentType = res.headers.get('Content-Type');
    const raw = await res.blob();
    // you have raw data and content-type

    imageHandler(contentType, raw);
}

如果不是:

fetch('')
    .then((res) => res.blob().then((raw) => {
        return { contentType: res.headers.get('Content-Type'), raw };
    }))
    .then((data) => {
        imageHandler(data.contentType, data.raw);
    });