当前位置: 首页 > article >正文

异步 HTTP 请求

fetch 是一个用于进行异步 HTTP 请求的 JavaScript API。

fetch 基本用法

// 使用 fetch 进行 GET 请求
fetch('https://api.example.com/data')
    .then(response => {
        // 检查响应是否成功
        if (!response.ok) {
            throw new Error('Network response was not ok');
        }
        // 解析响应数据为 JSON
        return response.json();
    })
    .then(data => {
        // 处理 JSON 数据
        console.log(data);
    })
    .catch(error => {
        // 处理错误
        console.error('There has been a problem with your fetch operation:', error);
    });

发送 POST 请求

// 使用 fetch 进行 POST 请求
fetch('https://api.example.com/data', {
    method: 'POST', // 指定请求方法为 POST
    headers: {
        'Content-Type': 'application/json' // 设置请求头
    },
    body: JSON.stringify({
        key1: 'value1',
        key2: 'value2'
    }) // 将数据转换为 JSON 字符串
})
    .then(response => {
        if (!response.ok) {
            throw new Error('Network response was not ok');
        }
        return response.json();
    })
    .then(data => {
        console.log(data);
    })
    .catch(error => {
        console.error('There has been a problem with your fetch operation:', error);
    });

处理不同的响应格式

fetch('https://api.example.com/data')
    .then(response => {
        // 处理文本响应
        return response.text();
    })
    .then(text => {
        console.log(text);
    });

fetch('https://api.example.com/image')
    .then(response => {
        // 处理 Blob 响应
        return response.blob();
    })
    .then(blob => {
        const img = document.createElement('img');
        img.src = URL.createObjectURL(blob);
        document.body.appendChild(img);
    });

使用 Async/Await

async function fetchData() {
    try {
        const response = await fetch('https://api.example.com/data');
        if (!response.ok) {
            throw new Error('Network response was not ok');
        }
        const data = await response.json();
        console.log(data);
    } catch (error) {
        console.error('There has been a problem with your fetch operation:', error);
    }
}

fetchData();

错误处理

处理错误时,fetch 只会在网络故障或请求被阻止的情况下拒绝 Promise。对于 HTTP 错误状态码(如 404 或 500),需要手动检查响应的 ok 属性:

fetch('https://api.example.com/data')
    .then(response => {
        if (!response.ok) {
            throw new Error('HTTP error! status: ' + response.status);
        }
        return response.json();
    })
    .then(data => {
        console.log(data);
    })
    .catch(error => {
        console.error('There has been a problem with your fetch operation:', error);
    });

fetch 并行的异步请求

// 定义要获取的 URL 列表
const urls = [
    'https://api.example.com/data1',
    'https://api.example.com/data2',
    'https://api.example.com/data3'
];

// 使用 fetch 并行请求所有 URL
Promise.all(urls.map(url => fetch(url)))
    .then(responses => {
        // 检查所有响应是否都成功
        responses.forEach(response => {
            if (!response.ok) {
                throw new Error(`Network response was not ok for ${response.url}`);
            }
        });
        // 将所有响应解析为 JSON
        return Promise.all(responses.map(response => response.json()));
    })
    .then(dataArray => {
        // 处理所有解析后的数据
        console.log(dataArray);
    })
    .catch(error => {
        // 处理任何请求中的错误
        console.error('There has been a problem with your fetch operation:', error);
    });

 Async/Await 进行并行请求

async function fetchDataInParallel(urls) {
    try {
        // 并行请求所有 URL
        const responses = await Promise.all(urls.map(url => fetch(url)));

        // 检查所有响应是否都成功
        responses.forEach(response => {
            if (!response.ok) {
                throw new Error(`Network response was not ok for ${response.url}`);
            }
        });

        // 将所有响应解析为 JSON
        const dataArray = await Promise.all(responses.map(response => response.json()));

        // 处理所有解析后的数据
        console.log(dataArray);
    } catch (error) {
        // 处理任何请求中的错误
        console.error('There has been a problem with your fetch operation:', error);
    }
}

// 定义要获取的 URL 列表
const urls = [
    'https://api.example.com/data1',
    'https://api.example.com/data2',
    'https://api.example.com/data3'
];

// 调用 fetchDataInParallel 函数
fetchDataInParallel(urls);

更多内容

使用 Fetch - Web API | MDN

https://www.ruanyifeng.com/blog/2020/12/fetch-tutorial.html


http://www.kler.cn/a/508391.html

相关文章:

  • Java 视频处理:基于 MD5 校验秒传及 ffmpeg 切片合并的实现
  • AWS S3 跨账户访问 Cross Account Access
  • LabVIEW实车四轮轮速信号再现系统
  • css中的阴影详解
  • Linux第二课:LinuxC高级 学习记录day04
  • FFmpeg硬件解码
  • Spring Boot使用WebSocket
  • 游戏引擎学习第79天
  • 零基础构建最简单的 Tauri2.0 桌面项目 Star 88.4k!!!
  • 【STM32-学习笔记-8-】I2C通信
  • mayavi -> python 3D可视化工具Mayavi的安装
  • GoLang教程003:数据类型介绍
  • Java基础(二)
  • 基于 Spring Boot 和 Vue.js 的全栈购物平台开发实践
  • 正则表达式基础知识及grep、sed、awk常用命令
  • 【JVM-10】IBM HeapAnalyzer 工具使用指南:深入解析 Java 堆转储分析
  • 【微服务】SpringCloud 1-9章
  • R语言绘图
  • go语言gui窗口应用之fyne框架-自定义容器实现自定义布局,更灵活的显示控件
  • sparkSQL练习
  • 使用FineBI进行数据分析(入门级)
  • 天机学堂3-ES+Caffeine
  • 多个页面一张SQL表,前端放入type类型
  • C++实现设计模式---中介者模式 (Mediator)
  • 【机器学习:三十三(一)、支持向量机】
  • YOLOv11改进,YOLOv11检测头融合RFAConv卷积,并添加小目标检测层(四头检测),适合目标检测、分割等任务