JavaScript实现接口请求的超时机制方法汇总

在 JavaScript 中实现接口请求的超时机制有多种方法。以下是几种常见的方法汇总:

1. 使用 Promise.race

Promise.race 方法可以将请求的 Promise 和一个超时的 Promise 结合起来,哪个 Promise 先完成就以哪个为准。

const fetchWithTimeout = (url, options = {}, timeout = 5000) => {
  const fetchPromise = fetch(url, options);

  const timeoutPromise = new Promise((_, reject) => {
    setTimeout(() => {
      reject(new Error('Request timed out'));
    }, timeout);
  });

  return Promise.race([fetchPromise, timeoutPromise]);
};

// 使用示例
fetchWithTimeout('https://jsonplaceholder.typicode.com/posts', { method: 'GET' }, 3000)
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(err => console.error('Error:', err));

2. 使用 AbortController

AbortController 是一个现代的 API,用于中止 fetch 请求。可以结合 setTimeout 实现超时机制。

const fetchWithTimeout = (url, options = {}, timeout = 5000) => {
  const controller = new AbortController();
  const { signal } = controller;

  const fetchPromise = fetch(url, { ...options, signal });

  const timeoutId = setTimeout(() => {
    controller.abort();
  }, timeout);

  return fetchPromise.finally(() => clearTimeout(timeoutId));
};

// 使用示例
fetchWithTimeout('https://jsonplaceholder.typicode.com/posts', { method: 'GET' }, 3000)
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(err => console.error('Error:', err));

3. 使用 axios 的超时选项

如果你使用 axios 库,可以直接使用其内置的超时选项。

const axios = require('axios');

axios.get('https://jsonplaceholder.typicode.com/posts', { timeout: 3000 })
  .then(response => console.log(response.data))
  .catch(err => console.error('Error:', err));

4. 手动实现超时机制

通过 setTimeoutPromise 结合来实现

const fetchWithTimeout = (url, options = {}, timeout = 5000) => {
  return new Promise((resolve, reject) => {
    const timeoutId = setTimeout(() => {
      reject(new Error('Request timed out'));
    }, timeout);

    fetch(url, options)
      .then(response => {
        clearTimeout(timeoutId);
        resolve(response);
      })
      .catch(err => {
        clearTimeout(timeoutId);
        reject(err);
      });
  });
};

// 使用示例
fetchWithTimeout('https://jsonplaceholder.typicode.com/posts', { method: 'GET' }, 3000)
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(err => console.error('Error:', err));

总结

  • Promise.race:将请求的 Promise 和一个超时的 Promise 结合起来,哪个 Promise 先完成就以哪个为准。
  • AbortController:使用现代的 API 中止 fetch 请求,结合 setTimeout 实现超时机制。
  • axios 的超时选项:如果使用 axios 库,可以直接使用其内置的超时选项。
  • 手动实现超时机制:通过 setTimeoutPromise 结合来实现。

选择适合你项目需求的方法来实现接口请求的超时机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值