五、取消fetch()请求

fetch()请求发送以后,如果中途想要取消,需要使用AbortController对象。

  1. let controller = new AbortController();
  2. let signal = controller.signal;
  3. fetch(url, {
  4. signal: controller.signal
  5. });
  6. signal.addEventListener('abort',
  7. () => console.log('abort!')
  8. );
  9. controller.abort(); // 取消
  10. console.log(signal.aborted); // true

上面示例中,首先新建 AbortController 实例,然后发送fetch()请求,配置对象的signal属性必须指定接收 AbortController 实例发送的信号controller.signal

controller.abort()方法用于发出取消信号。这时会触发abort事件,这个事件可以监听,也可以通过controller.signal.aborted属性判断取消信号是否已经发出。

下面是一个1秒后自动取消请求的例子。

  1. let controller = new AbortController();
  2. setTimeout(() => controller.abort(), 1000);
  3. try {
  4. let response = await fetch('/long-operation', {
  5. signal: controller.signal
  6. });
  7. } catch(err) {
  8. if (err.name == 'AbortError') {
  9. console.log('Aborted!');
  10. } else {
  11. throw err;
  12. }
  13. }