讲师中心 微信公众号
AI工具推荐 视频效率加速

JavaScript中实现API分页:高效循环获取全部数据的教程

星伟同学_1380

星伟同学_1380

发布时间:2025-11-19 17:51:18

|

1015人浏览过

|

来源于php中文网

原创

JavaScript中实现API分页:高效循环获取全部数据的教程

本教程详细介绍了如何在javascript中通过迭代循环机制高效地从支持分页的api中获取所有可用数据。我们将探讨如何利用`async/await`处理异步请求,并通过动态调整请求参数(如`start`和`limit`或`page`和`size`)来遍历所有数据页,直至所有数据被成功收集。

理解API分页机制

大多数RESTful API为了优化性能和管理数据传输量,都会对单个请求返回的数据量设置上限。这意味着如果数据集较大,API会通过分页(Pagination)机制将数据拆分成多个“页”或“批次”。开发者需要通过连续发送请求,并调整特定的查询参数来逐页获取所有数据。

常见的API分页参数包括:

  • start (或 offset): 指定从哪个位置开始返回数据,通常是基于0的索引。
  • limit (或 size): 指定每个请求返回的最大数据条数。
  • page: 指定要请求的页码,通常从1开始。

例如,Indeed搜索API可能使用start和limit参数来控制分页,如start=0&limit=50表示从第0条开始获取50条数据。

设计循环获取数据的策略

为了获取所有分页数据,我们需要一个迭代过程,它能够:

chartjs-reporter
chartjs-reporter

此技能用于在用户需要将结构化数据(查询结果、CSV 摘要、JSON 记录或 Python 字典/列表)转换为独立的 HTML 页面时使用。

下载

立即学习“Java免费学习笔记(深入)”;

  1. 发送初始请求:获取第一页数据和总数据量信息。
  2. 判断是否需要继续:根据已获取的数据量和API报告的总数据量来决定。
  3. 更新请求参数:为下一次请求准备正确的start或page值。
  4. 聚合数据:将每次请求获取的数据累积起来。
  5. 处理异步:由于API请求是异步操作,需要使用async/await确保请求按序执行并等待响应。

实现分页获取数据的JavaScript代码

下面是一个通用的JavaScript实现,它利用async/await和for循环来处理API分页。我们将以一个假想的API为例,该API在响应中包含当前页数据和总数据量。

async function fetchAllPaginatedData(baseUrl, itemsPerPage = 50) {
    let allData = []; // 用于存储所有获取到的数据
    let totalItems = 0; // API报告的总数据量
    let loopNeeded = true; // 控制循环是否继续的标志

    console.log(`开始从 ${baseUrl} 获取所有分页数据...`);

    // 使用 for 循环进行迭代,直到所有数据获取完毕
    // 变量 i 可以代表页码 (page) 或偏移量的倍数 (start/offset)
    for (let i = 0; loopNeeded; i++) {
        // 构建当前页的URL。
        // 如果API使用 'page' 和 'size' 参数,URL可能形如: `${baseUrl}?page=${i}&size=${itemsPerPage}`
        // 如果是 Indeed API 等使用 'start' 和 'limit' 参数,URL则形如:
        const url = `${baseUrl}?start=${i * itemsPerPage}&limit=${itemsPerPage}`;
        console.log(`正在请求: ${url}`);

        try {
            const response = await fetch(url);
            if (!response.ok) {
                throw new Error(`HTTP 错误! 状态: ${response.status}`);
            }
            const data = await response.json();

            // 假设API响应结构为 { data: [...], totalItems: N }
            // 请根据实际API响应调整这里的数据提取逻辑
            const currentBatch = data.data || []; // 当前页的数据
            // 首次请求或当API每次都返回总数时更新 totalItems
            totalItems = data.totalItems !== undefined ? data.totalItems : totalItems; 

            allData = allData.concat(currentBatch); // 将当前页数据添加到总数据列表中

            console.log(`已获取 ${allData.length} / ${totalItems} 条数据。`);

            // 判断是否已获取所有数据
            // 1. 已获取的数据量达到或超过API报告的总数据量
            // 2. 当前批次为空,意味着没有更多数据可获取了(即使totalItems不准确也能停止)
            if (allData.length >= totalItems || currentBatch.length === 0) {
                loopNeeded = false; // 停止循环
            }
        } catch (error) {
            console.error(`获取数据时发生错误: ${error}`);
            loopNeeded = false; // 发生错误时停止循环
        }
    }

    console.log(`所有数据获取完成。共获取 ${allData.length} 条数据。`);
    return allData;
}

// 示例调用 (使用一个公开的测试API,类似于问题答案中提供的)
// 注意:该示例API使用 'page' 和 'size',因此在实际调用时需要调整 fetchAllPaginatedData 内部的URL构建逻辑
// 或者创建一个专门适配该API的包装函数。
// 为了演示,我们假设其行为与 Indeed 的 'start'/'limit' 类似,只是参数名不同。
const sampleApiBaseUrl = "https://api.instantwebtools.net/v1/passenger";
// 实际测试时,可能需要将 fetchAllPaginatedData 函数中的URL构建改为:
// const url = `${baseUrl}?page=${i}&size=${itemsPerPage}`;
fetchAllPaginatedData(sampleApiBaseUrl, 100).then(results => {
    console.log("最终获取到的乘客数据:", results);
}).catch(err => console.error("获取乘客数据失败:", err));

// Indeed API 示例 (注释掉,因为需要 Indeed API 的有效 token 和实际数据)
/*
const indeedBaseUrl = "https://resumes.indeed.com/rpc/search";
const indeedCsrfToken = "YOUR_INDEED_CSRF_TOKEN"; // 替换为你的实际 token
const indeedQuery = "sales";
const indeedLocation = "Orlando,FL";
const indeedLmd = "3day";
const indeedRadius = "25";

async function fetchIndeedData() {
    let allIndeedData = [];
    let currentStart = 0;
    const indeedLimit = 50; // Indeed API 每次请求的限制
    let totalIndeedResults = 0;
    let continueFetching = true;

    for (let i = 0; continueFetching; i++) {
        // Indeed API 使用 'start' 作为偏移量
        const indeedUrl = `${indeedBaseUrl}?q=${indeedQuery}&l=${indeedLocation}&start=${currentStart}&limit=${indeedLimit}&lmd=${indeedLmd}&radius=${indeedRadius}&indeedcsrftoken=${indeedCsrfToken}`;
        console.log(`正在请求 Indeed: ${indeedUrl}`);

        try {
            const response = await fetch(indeedUrl);
            if (!response.ok) {
                throw new Error(`Indeed API HTTP 错误! 状态: ${response.status}`);
            }
            const data = await response.json();

            // 假设 Indeed API 响应结构包含 'results' 数组和 'totalResults' 字段
            const currentIndeedBatch = data.results || [];
            totalIndeedResults = data.totalResults !== undefined ? data.totalResults : totalIndeedResults;

            allIndeedData = allIndeedData.concat(currentIndeedBatch);
            console.log(`已获取 Indeed ${allIndeedData.length} / ${totalIndeedResults} 条数据。`);

            // 更新下一个请求的起始偏移量
            currentStart += indeedLimit;

            // 终止条件:已获取的数据量达到或超过总结果数,或当前批次为空
            if (allIndeedData.length >= totalIndeedResults || currentIndeedBatch.length === 0) {
                continueFetching = false;
            }
        } catch (error) {
            console.error(`获取 Indeed 数据时发生错误: ${error}`);
            continueFetching = false;
        }
    }
    console.log(`Indeed 数据获取完成。共获取 ${allIndeedData.length} 条数据。`);
    return allIndeedData;
}

// fetchIndeedData().then(results => {
//     console.log("最终获取到的 Indeed 数据:", results);
// }).catch(err => console.error("获取 Indeed 数据失败:", err));
*/

代码解析:

  1. fetchAllPaginatedData(baseUrl, itemsPerPage) 函数:这是一个异步函数,接受API的基础URL和每页数据量作为参数。
  2. allData 数组:用于累积从所有页获取的数据。
  3. totalItems:用于存储API响应中报告的总数据量。它在首次请求时或每次请求都提供总数时更新。
  4. loopNeeded 标志:控制for循环的执行。当所有数据都已获取或发生错误时,此标志设为false,循环终止。
  5. 循环逻辑:
    • 在每次迭代中,根据i(当前页码或偏移量)和itemsPerPage构建请求URL。对于使用start和limit的API,start参数应为i * itemsPerPage。
    • 使用fetch发送异步请求,并用await等待响应。
    • 错误处理:检查response.ok,如果状态码不是2xx,则抛出错误。try...catch块用于捕获网络错误或JSON解析错误。
    • 数据提取:从API响应中提取当前页的数据 (data.data) 和总数据量 (data.totalItems)。请务必根据你实际使用的API响应结构调整这一部分。
    • 数据聚合:使用concat方法将当前页数据添加到allData数组中。
    • 终止条件:
      • 当allData.length >= totalItems时,表示已获取的数据量达到或超过API报告的总量,循环终止。
      • currentBatch.length === 0 是一个重要的备用终止条件,尤其是在API不提供`

热门AI工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
PHP API接口开发与RESTful实践
PHP API接口开发与RESTful实践

本专题聚焦 PHP在API接口开发中的应用,系统讲解 RESTful 架构设计原则、路由处理、请求参数解析、JSON数据返回、身份验证(Token/JWT)、跨域处理以及接口调试与异常处理。通过实战案例(如用户管理系统、商品信息接口服务),帮助开发者掌握 PHP构建高效、可维护的RESTful API服务能力。

544

2025.11.26

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2175

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3402

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1136

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3919

2025.09.10

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

1887

2023.09.19

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

40

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

40

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.3万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn