我正在编写一个将从 API 检索数据的脚本。我需要获取 API 中数据的所有实例,但 API 限制我一次只能获得 250 个结果。响应还为我提供了一个偏移量编号,我可以在新的 API 调用中使用它来获取下一组结果。我知道我需要对 API 进行多少次调用,我的想法是在参数中使用一个变量,这样我就可以在每次调用 API 后更新偏移量。问题总是取决于实际设置变量并在循环再次运行时使用它。
我能够运行 ajax 请求并返回数据,然后将偏移量设置为一个变量。我已经尝试创建一个初始 API 调用,然后返回响应,然后在 for 循环内的新函数中使用该返回值。这似乎是最接近我的解决方案,但每次循环运行时,变量都会重置为 null,我会得到初始偏移值。
这是最新的代码:
for (iteration = 1; iteration < 4; iteration++) {
let offsetValue;
pullWriteData = offsetValue => {
return axios({
method: "get",
url: "https://api.hubapi.com/engagements/v1/engagements/paged",
params: {
hapikey: "API_KEY_HERE",
limit: 250,
offset: offsetValue
}
}).then(response => {
return response.data;
});
};
pullWriteData().then(data => {
offsetValue = data.offset;
console.log("New offset value: " + offsetValue);
return offsetValue;
});
}
此代码返回:
New offset value: 12345678
New offset value: 12345678
New offset value: 12345678
我还在我的 pullWriteData() 调用的 .then
中构建了第二个 Axios 调用,这确实有效,但这肯定违背了编写程序来为我执行此操作的目的。
我的期望是这将运行初始 API 调用,将数据写入文件,更新 offsetValue
,使用新的 offsetValue
再次运行 API 调用,将该响应写入文件,更新 offsetValue
并重复,直到我提取了所有数据。
就将数据写入文件而言,我已经能够使用 fs
来完成。只是获取要更新的 offsetValue
值似乎让我很烦恼。
提前感谢您的指导。
最佳答案
使用 async/await
,您可以使用 promises
执行以下操作,以确保每次都获得下一个 offset
并进行设置在循环中,以便下一个链接的 async
请求将新的 offset
传递给请求。
注意:对于您当前的迭代,您只会发出 3 个请求,从 GET
请求中没有 offset=
开始,并且那么接下来的 2 个请求将分别使用第一个和第二个请求返回的 offset
值,第三个返回的 offset
值不被使用,因为没有发出另一个请求.
const getEngagements = (offsetValue) => {
return new Promise((resolve, reject) => {
axios({
method: "get",
url: "https://api.hubapi.com/engagements/v1/engagements/paged",
params: {
hapikey: "demo",
limit: 250,
offset: offsetValue
}
}).then(response => {
return resolve(response.data);
}).catch(error => {
return reject(error.message)
})
})
}
const startPaging = async() => {
let offsetValue;
for (let num of [1, 2, 3]) {
await getEngagements(offsetValue).then((data) => {
offsetValue = data.offset;
console.log("New offset value: " + offsetValue);
})
}
/* You could also do a while() loop for while
* dataHasMore = true from response data, if you
* weren't doing a fixed iteration..
*/
/*
let dataHasMore = true;
while (dataHasMore) {
await getEngagements(offsetValue).then((data) => {
dataHasMore = data.hasMore;
offsetValue = data.offset;
console.log("New offset value: " + offsetValue);
})
}
*/
console.log('Done');
}
startPaging();
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
关于javascript - 如何使用 Axios 响应作为 for 循环中的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56549167/