2.2 判断请求是否成功

fetch()发出请求以后,有一个很重要的注意点:只有网络错误,或者无法连接时,fetch()才会报错,其他情况都不会报错,而是认为请求成功。

这就是说,即使服务器返回的状态码是 4xx 或 5xx,fetch()也不会报错(即 Promise 不会变为 rejected状态)。

只有通过Response.status属性,得到 HTTP 回应的真实状态码,才能判断请求是否成功。请看下面的例子。

  1. async function fetchText() {
  2. let response = await fetch('/readme.txt');
  3. if (response.status >= 200 && response.status < 300) {
  4. return await response.text();
  5. } else {
  6. throw new Error(response.statusText);
  7. }
  8. }

上面示例中,response.status属性只有等于 2xx (200~299),才能认定请求成功。这里不用考虑网址跳转(状态码为 3xx),因为fetch()会将跳转的状态码自动转为 200。

另一种方法是判断response.ok是否为true

  1. if (response.ok) {
  2. // 请求成功
  3. } else {
  4. // 请求失败
  5. }