使用异步等待获取失败时如何捕获状态代码

时间:2019-07-10 16:18:03

标签: javascript error-handling async-await

上下文

我要从Promises的一个请求中使用async/awaitfetch(我在Vuex action内部使用,但这不是理解我的问题所必需的)。

使用以下代码,在请求失败的情况下,我可以根据响应的状态代码向最终用户提供错误消息。

fetch("http://localhost:8000/api/v1/book", {
  headers: {
    Accept: "application/json"
  }
}).then(response => {
  if (!response.ok) {
    if (response.status === 429) {
      // displaying "wow, slow down mate"
    } else if (response.status === 403) {
      // displaying "hm, what about no?"
    } else {
      // displaying "dunno what happened \_(ツ)_/¯"   
    }

    throw new Error(response);
  } else {
    return response.json();
  }
}).then(books => {
  // storing my books in my Vuex store
})
.catch(error => {
  // storing my error onto Sentry
});

问题

使用async/await,这就是我的代码现在的样子:

try {
  const response = await fetch("http://localhost:8000/api/v1/book", {
    headers: {
      Accept: "application/json"
    }
  });

  const books = await response.json();

  // storing my books
} catch(exception) {
  // storing my error onto Sentry
}

问题

如果使用async/await失败,如何确定我的响应返回了哪个状态代码?

如果我使用的方式错误,请不要犹豫,以更好的方式纠正我。

注释

我制作了一个JSFiddle来实时测试该问题。随时更新。

https://jsfiddle.net/180ruamk/

1 个答案:

答案 0 :(得分:0)

它将与您的then回调中的代码完全相同:

try {
  const response = await fetch("http://localhost:8000/api/v1/book", {
    headers: {
      Accept: "application/json"
    }
  });
  if (!response.ok) {
    if (response.status === 429) {
      // displaying "wow, slow down mate"
    } else if (response.status === 403) {
      // displaying "hm, what about no?"
    } else {
      // displaying "dunno what happened \_(ツ)_/¯"   
    }
    throw new Error(response);
  }
  const books = await response.json();

  // storing my books
} catch(exception) {
  // storing my error onto Sentry
}