如何用offset参数实现fetch循环分页拉取OpenSea API全量数据
你当前的写法只会执行1次fetch请求,offset的累加也没有和后续的请求逻辑绑定,自然没法实现分页循环拉取。可以用async/await的方式实现需求,修改后的代码如下:
// 存储所有拉取到的assets数据 const allAssets = []; // 初始偏移量 let offset = 0; // 每页限制条数 const LIMIT = 50; // 用async函数处理异步逻辑更清晰 const fetchAllData = async () => { while (true) { try { const response = await fetch(`https://api.opensea.io/api/v1/assets?collection=womenandweapons&format=json&offset=${offset}&limit=${LIMIT}&order_direction=desc`, { method: 'GET', headers: { 'Accept': 'application/json' } }); const data = await response.json(); const currentAssets = data.assets || []; // 把当前页的数据加入总数组 allAssets.push(...currentAssets); console.log(`已拉取${currentAssets.length}条,累计${allAssets.length}条`); // 满足终止条件:当前页返回条数小于限制值,说明已经到最后一页 if (currentAssets.length < LIMIT) { break; } // 偏移量累加,进入下一次循环拉取下一页 offset += LIMIT; // 可选:如果遇到接口限流,可以在这里加延迟,比如每次请求间隔1秒 // await new Promise(resolve => setTimeout(resolve, 1000)); } catch (err) { console.error('请求出错:', err); // 出错处理逻辑:可以选择重试,或者直接终止 break; } } // 循环结束后,allAssets就是完整的数据集 console.log('全部拉取完成,总条数:', allAssets.length); // 后续可以在这里处理allAssets的业务逻辑 } // 执行拉取 fetchAllData();
逻辑说明
- 用
while(true)实现无限循环,只有当返回数据条数小于50或者请求报错时才终止循环 - 每次请求拿到的单页数据通过扩展运算符
...拼接进总数组allAssets,最终得到完整数据集 - 加入了基础的错误捕获逻辑,避免单页请求失败导致整个流程中断
- 如果Opensea接口对你的请求有限流,可以打开代码里的延迟注释,避免触发接口频率限制
内容的提问来源于stack exchange,提问作者Gangrel
相关产品推荐
相关产品推荐

