如何将异步请求响应值传递至下一个请求?分页获取全量API数据
解决分页接口循环请求的问题(避免嵌套回调)
嘿,我懂你现在的烦恼——分页接口每次只能拿1000行,还得根据返回结果拿下一页的地址,不想写嵌套回调搞成“回调地狱”,想用Promise让代码更整洁对吧?刚好这个场景用async/await + Promise封装就能完美解决,我给你一步步来实现:
第一步:把回调式请求封装成Promise
首先,你原来用的request是回调风格的,我们先把它封装成返回Promise的函数,这样才能用async/await来写同步风格的异步代码:
const request = require('request'); // 假设你用的是request库 // 封装分页请求为Promise function fetchPage(url, headers) { return new Promise((resolve, reject) => { const options = { method: 'GET', headers, url }; request(options, (error, response, body) => { if (error) { reject(error); return; } // 解析返回的响应体(注意:这里要根据你接口的实际返回结构调整) const parsedResponse = JSON.parse(body); // 假设接口返回的下一页地址存在于nextEndpoint字段,你改成实际字段名即可 resolve({ pageData: parsedResponse, // 当前页的数据 nextUrl: parsedResponse.nextEndpoint // 下一页的请求地址,没有的话会是undefined }); }); }); }
第二步:用async/await循环请求所有分页
接下来写一个异步函数,用while循环来不断请求下一页,直到没有下一页地址为止,同时把所有页的数据拼接起来:
async function fetchAllResults(initialUrl, headers) { const allData = []; let currentUrl = initialUrl; // 只要还有下一页的地址,就继续请求 while (currentUrl) { try { const { pageData, nextUrl } = await fetchPage(currentUrl, headers); // 把当前页的数据加入总数组(如果pageData是数组就用...展开,否则直接push,根据实际结构调整) allData.push(...pageData); // 更新为下一页的地址,没有的话nextUrl是undefined,循环自动终止 currentUrl = nextUrl; } catch (error) { console.error('单页请求失败:', error); // 这里可以根据需求选择:抛出错误终止循环,或者跳过错误继续请求 throw error; } } return allData; }
第三步:调用函数获取全部数据
最后用你的配置调用这个函数,处理最终的全部数据:
// 你的请求配置 const headers = { "Content-type": "application/json", "X-DBX-AUTH-TOKEN": "yyy@zzz.com/6573846tf9334e" }; const initialUrl = "https://endpoint/execute/{uuid}/0"; // 发起请求并处理结果 fetchAllResults(initialUrl, headers) .then(fullData => { console.log('所有数据已获取并拼接完成:', fullData); // 在这里处理你的全部数据 }) .catch(err => { console.error('获取全部数据失败:', err); });
关键注意点
- 字段适配:一定要根据你接口的实际返回结构调整字段名,比如你原来代码里的
next_uid,要对应到parsedResponse里的实际下一页地址字段,我这里用nextEndpoint只是示例。 - 错误处理:try/catch可以捕获单页请求的错误,你可以根据业务需求决定是终止整个流程还是跳过当前错误页继续请求。
- 数据拼接:如果当前页的数据不是数组,要调整
allData.push的方式,比如直接allData.push(pageData)或者根据结构提取数据。
内容的提问来源于stack exchange,提问作者kd1978
相关产品推荐
相关产品推荐

