如何在 fetch 的 then() 中捕获 json 文本

Posted

技术标签:

【中文标题】如何在 fetch 的 then() 中捕获 json 文本【英文标题】:How to capture the json text inside fetch's then() 【发布时间】:2017-09-02 07:00:04 【问题描述】:

我就是这样称呼fetch

fetchOpts = ...
return fetch(url, fetchOpts)
    .then(checkStatus)

我调用的url总是会返回一个json数据,即使是在错误的情况下:

error_message:"Encountered issue with update"
status:"error",
status_code:400

我想获取error_message 字段值并传递给Error 构造函数。

在 checkStatus 内部,它以这种方式处理异常:

function checkStatus(response) 
  let error = null;

  if (!response.headers.get('Content-Type').includes('application/json')) 
    error = new Error(response.statusText);
    error.response = response;
    throw error;
  

  if (response.status >= 200 && response.status < 300) 
    return response;
  

  if (response.ok) 
    return response;
  
  const jsonData = response.json() ; // <- `jsonData` is a promise
  error = new Error(/* How to extract error_message from json data? */);
  error.response = response;
  throw error;

我已经检查过这个问题,但它并没有真正解决我的需求fetch: Reject promise with JSON error object。此外,根据 cmets,接受的答案似乎不能完全解决 OP 的问题。

【问题讨论】:

【参考方案1】:

我可能误解了这个问题,但 error_message 成员作为 promise 返回的数据对象的属性公开,对吗?所以看起来你可以这样做:

response.json()
.then(jsonData => 
  if (jsonData.error_message) 
    error = new Error(jsonData.error_message)
  

【讨论】:

【参考方案2】:

如果您将最后一段代码更改为

return response.json().then(json => 
    error = new Error(json.error_message);
    error.response = response;
    throw error;

这应该做你想要的

【讨论】:

以上是关于如何在 fetch 的 then() 中捕获 json 文本的主要内容,如果未能解决你的问题,请参考以下文章

JS Fetch

循环执行 Node JS 中的 fetch 操作

如何在fetch then / response函数中访问请求对象

如何在 Fetch 的承诺链之外获取响应数据? [复制]

基于Promise规范的fetch API的使用

如何使用 fetch 在 javascript 中获取 php 错误消息