Javascript 拒绝获取承诺:访问响应文本

Javascript 拒绝获取承诺:访问响应文本,javascript,json,fetch-api,responsetext,Javascript,Json,Fetch Api,Responsetext,我正在使用加载一些JSON。因此,我在响应流上使用了,在中还使用了可选的第二个函数参数(onRejected),它只有一个参数,即拒绝原因 如果出现错误(比如响应没有有效的JSON),我希望访问原始响应文本时有一些有意义的错误日志,或者进一步处理意外响应 考虑一下这个简化的代码段: fetch('api.php')) .那么( response=>{return response.json();} ) .那么( json=>{/*有用的实现值,一个json对象*/}, 原因=>{/*仅限字符串消

我正在使用加载一些JSON。因此,我在响应流上使用了,在中还使用了可选的第二个函数参数(
onRejected
),它只有一个参数,即拒绝原因

如果出现错误(比如响应没有有效的JSON),我希望访问原始响应文本时有一些有意义的错误日志,或者进一步处理意外响应

考虑一下这个简化的代码段:

fetch('api.php'))
.那么(
response=>{return response.json();}
)
.那么(
json=>{/*有用的实现值,一个json对象*/},
原因=>{/*仅限字符串消息*/}
);
如果API响应的不是有效的JSON,它将拒绝,原因如下:

SyntaxError:JSON.parse:JSON数据的第1行第1列出现意外字符

虽然这是一条非常清晰的错误消息,但它缺少对实际导致错误的原因的转储

我考虑过自己使用并尝试解析JSON,但这有点违背了
.JSON()
的目的


如果流读取被拒绝,是否有合理的方法访问响应文本?

您可以检查内容类型:

  var contentType = response.headers.get("content-type");
  if(contentType && contentType.indexOf("application/json") !== -1) {
       response => { return response.json(); }
  }
  else{
       response => { return response.text(); }
  }

如果你想在拒绝回调中得到响应,你可以这样做

  response => { 
          var text = '';
          try{
              text= response.json(); 
          }
          catch (e if e instanceof SyntaxError) {
             text = response.text();
          } 
          return text;
  }

您可以检查内容类型:

  var contentType = response.headers.get("content-type");
  if(contentType && contentType.indexOf("application/json") !== -1) {
       response => { return response.json(); }
  }
  else{
       response => { return response.text(); }
  }

如果你想在拒绝回调中得到响应,你可以这样做

  response => { 
          var text = '';
          try{
              text= response.json(); 
          }
          catch (e if e instanceof SyntaxError) {
             text = response.text();
          } 
          return text;
  }

让我们说这很糟糕,但可以解决问题:

let res;
fetch('api.php')
.then(
    response => { res = response; return response.json(); }
)
.then(
    json => { /* useful fulfillment value, a JSON object */ },
    reason => { /* use res variable */ }
);

让我们说这很糟糕,但可以解决问题:

let res;
fetch('api.php')
.then(
    response => { res = response; return response.json(); }
)
.then(
    json => { /* useful fulfillment value, a JSON object */ },
    reason => { /* use res variable */ }
);

这将是一种简单、安全的方法来确保响应得到处理,但需要检查参数是否确实是JSON。我可以马上使用
.text()
。问题是,是否有某种方法可以访问拒绝回调中的响应。像上面这样的尝试如何?您尝试过吗?它仍然调用拒绝函数,可能是因为在响应流被读取到完成之后不会发生重新分配。这将是一种简单、安全的方法来确保响应进入处理,但需要检查参数是否确实是JSON。我可以马上使用
.text()
。问题是,是否有某种方法可以访问拒绝回调中的响应。像上面这样的尝试如何?您尝试过吗?它仍然调用拒绝函数,可能是因为在响应流被读取到完成之后没有重新分配。