Javascript fetch 处理 json 和 blob

Posted

技术标签:

【中文标题】Javascript fetch 处理 json 和 blob【英文标题】:Javascript fetch handle both json and blob 【发布时间】:2018-10-14 21:16:02 【问题描述】:

使用 javascript fetch 并调用 rest 服务,如果成功则返回 blob,否则返回 json 格式的错误消息。这将如何在 fetch 中处理?实际的服务是一个 asp.net web api 实现,成功时返回 FileStreamResult(或 FileContentResult),否则返回错误代码和包含错误消息的 json。下面是我正在尝试做的一个例子:

fetch('flowers.jpg').then(function(response) 
  if(response.ok) 
    return response.blob();
   else 
    return response.json();


).then(function(myBlob)   // here I would also like to function(jsonError)
  var objectURL = URL.createObjectURL(myBlob); 
  myImage.src = objectURL; 
).catch(function(error) 
  console.log('There has been a problem with your fetch operation: ', error.message);
);

【问题讨论】:

【参考方案1】:

您可以使用嵌套的 then 块将您想要的任何内容传递给您的下一个 then 处理程序。示例:

fetch('flowers.jpg').then(function (response) 
    if (response.ok) 
        return response.blob()
            .then(function (myBlob) 
                return 
                    blob: myBlob
                ;
            );
     else 
        return response.json()
            .then(function (myJson) 
                return 
                    json: myJson
                ;
            );
    

).then(function (myData)  
    if(myData.blob)
        // Handle blob case
    else
        // Handle JSON case
    
).catch(function (error) 
    console.log('There has been a problem with your fetch operation: ', error.message);
);

也许在语义上更准确的处理方法是在出现错误时拒绝。

fetch('flowers.jpg').then(function (response) 
    if (response.ok) 
        return response.blob();
     else 
        return response.json()
            .then(function (myJson) 
                return Promise.reject(myJson);
            );
    

).then(function (myData) 
    // Handle blob case
).catch(function (error) 
    //Handle JSON case
);

【讨论】:

then 处理程序中没有指向return Promise.resolve(value); 的意义,只需使用return value;then 总是返回一个promise,如果你不返回promise,它会用你返回的值来解决(或者用你抛出的东西拒绝)。 (如果你这样做了,promise then 会创建并返回链给它。)所以它只是创建了一个额外的层。 :-) 啊,是的。出于“可读性”的目的,这是我的一个坏习惯。需要停止这样做:)【参考方案2】:

由于您想要走两条完全不同的路径,这是您可能想要嵌套处理程序的相对罕见的情况之一:

fetch('flowers.jpg').then(function(response) 
    if (response.ok) 
        return response.blob().then(function(myBlob) 
            var objectURL = URL.createObjectURL(myBlob);
            myImage.src = objectURL;
        );
     else 
        return response.json().then(function(jsonError) 
            // ...
        );
    
).catch(function(error) 
    console.log('There has been a problem with your fetch operation: ', error.message);
);

【讨论】:

以上是关于Javascript fetch 处理 json 和 blob的主要内容,如果未能解决你的问题,请参考以下文章

javascript 使用Fetch WORKING发布Json

JavaScript fetch API - 为啥 response.json() 返回一个 promise 对象(而不是 JSON)? [复制]

JavaScript fetch API和Python Flask头问题

在 Javascript/Reactjs 中使用 Fetch API 和 map() 显示 JSON 数据

Javascript Fetch:错误 Unexpected token < in JSON at position 0

如何在不使用 JQuery 的情况下使用 fetch API 以 JSON 格式发布表单数据?