• 给Fetch添加超时功能


    引言

    在Web开发中,使用Fetch API进行网络请求是一种常见的方式。然而,Fetch API默认不包含超时功能,这可能导致程序在网络不稳定的情况下长时间阻塞。为了解决这个问题,我们可以通过一些技术手段来为Fetch请求添加超时功能,以提高程序的稳定性和用户体验。

    实现步骤

    1. 使用Promise.race设置超时

    首先,我们可以利用Promise.race方法来实现一个包含超时功能的Fetch请求。这个方法会创建一个Promise,它会在一组Promises中的任意一个被解决(resolved)或拒绝(rejected)时解决或拒绝。

    function fetchWithTimeout(url, options, timeout = 5000) {
      const timeoutPromise = new Promise((_, reject) =>
        setTimeout(() => reject(new Error('Request timeout')), timeout)
      );
    
      return Promise.race([
        fetch(url, options),
        timeoutPromise
      ]);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2. 使用async/await简化调用

    为了使代码更清晰,我们可以使用async/await来简化Fetch请求的调用。这样可以使代码更具可读性,并且更容易处理错误。

    async function fetchData() {
      try {
        const response = await fetchWithTimeout('https://api.example.com/data');
        const data = await response.json();
        console.log('Data:', data);
      } catch (error) {
        console.error('Error:', error.message);
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    原理及描述

    上述代码的原理是利用Promise.race方法,将Fetch请求和一个定时器的Promise放入一个数组中,当其中一个Promise解决时,整个race Promise也会解决。如果Fetch请求在规定的超时时间内没有完成,定时器的Promise会先解决,从而触发超时错误。

    优势

    1. 提高程序稳定性: 通过添加超时功能,可以防止由于网络问题导致的长时间阻塞,提高程序的稳定性。
    2. 改善用户体验: 在网络状况不佳的情况下,及时处理超时可以提供更好的用户体验,而不是让用户长时间等待。

    劣势

    1. 不适用于所有场景: 超时设置可能不适用于所有网络请求,因为有些请求可能需要更长的时间来完成。在这种情况下,需要根据具体情况调整超时时间。

    总结

    通过给Fetch请求添加超时功能,我们可以有效地提高程序的稳定性和用户体验。使用Promise.race和async/await的组合,可以使代码清晰、简洁,并且更容易处理错误。然而,需要根据具体情况调整超时时间,以确保适用于不同的网络请求场景。

  • 相关阅读:
    JDK1.7和JDK1.8中HashMap线程不安全的原因详解
    github新手使用详解及环境搭建案例
    1.4 想要通过小红书赚钱,这些底层逻辑你一定要懂!【玩赚小红书】
    XX市消防救援指挥中心实战指挥平台多链路聚合解决方案实例
    2024 全国水科技大会暨第二届智慧水环境管理与技术创新论坛
    线程池源码解析 4.runWorker() 方法
    借助reCAPTCHA实现JavaScript验证码功能
    notifyIcon动态图标
    移动化拖拽元素移动
    【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(三)
  • 原文地址:https://blog.csdn.net/qq_43784821/article/details/134525146