Javascript 如何将Axios响应用作for循环中的参数?
我正在编写一个脚本,从API检索数据。我需要获取API中的所有数据实例,但API限制我一次只能得到250个结果。响应还为我提供了一个偏移量,我可以在新的API调用中使用它来获得下一组结果。我知道我需要对API进行多少次调用,我的想法是在params中使用一个变量,这样我就可以在每次调用API后更新偏移量。问题总是落在实际设置变量并在循环再次运行时使用它上 我能够运行ajax请求并返回数据,然后将偏移量设置为变量。我尝试创建一个初始API调用,然后返回响应,然后在for循环中的一个新函数中使用该返回值。对我来说,这似乎是最接近的解决方案,但每次循环运行时,变量都重置为null,然后我得到初始偏移值 以下是最新的代码:Javascript 如何将Axios响应用作for循环中的参数?,javascript,for-loop,promise,axios,Javascript,For Loop,Promise,Axios,我正在编写一个脚本,从API检索数据。我需要获取API中的所有数据实例,但API限制我一次只能得到250个结果。响应还为我提供了一个偏移量,我可以在新的API调用中使用它来获得下一组结果。我知道我需要对API进行多少次调用,我的想法是在params中使用一个变量,这样我就可以在每次调用API后更新偏移量。问题总是落在实际设置变量并在循环再次运行时使用它上 我能够运行ajax请求并返回数据,然后将偏移量设置为变量。我尝试创建一个初始API调用,然后返回响应,然后在for循环中的一个新函数中使用该返
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;
});
}
我还在pullWriteData()调用的.then
中构建了第二个Axios调用,这是可行的,但这显然违背了为我编写程序的目的
我的期望是,这将运行初始API调用,将数据写入文件,更新offsetValue
,使用新的offsetValue
再次运行API调用,将响应写入文件,更新offsetValue
并重复,直到我提取了所有数据
至于将数据写入文件,我已经能够使用fs
完成。似乎让我烦恼的是更新offsetValue
值
提前感谢您的指导。我认为您可以根据需要调整此示例:
(async () => {
const times = Array.from({ length: 4 }, (_, i) => i));
let offset;
for (let i of times) {
offset = await pullWriteData(offset);
}
})();
function 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 => response.data);
}
使用
async/await
,您可以使用promises
执行以下操作,以确保每次都获得下一个offset
,并将其设置在循环中,以便下一个链式async
请求将新的offset
传递给请求
注意:在当前迭代中,您只会发出3个请求,从GET
请求中的nooffset=
开始,然后接下来的2个请求将分别使用第一个和第二个请求返回的offset
值,并且返回的第三个偏移量值未被使用,因为未发出另一个请求
const getEngagements=(offsetValue)=>{
返回新承诺((解决、拒绝)=>{
axios({
方法:“获取”,
url:“https://api.hubapi.com/engagements/v1/engagements/paged",
参数:{
哈皮基:“演示”,
限额:250,
偏移量:偏移量值
}
})。然后(响应=>{
返回解析(response.data);
}).catch(错误=>{
返回拒绝(错误消息)
})
})
}
常量启动=异步()=>{
让抵销价值;
for(设[1,2,3]的数量){
等待getEngagements(offsetValue)。然后((数据)=>{
offsetValue=data.offset;
console.log(“新偏移值:”+offsetValue);
})
}
/*您还可以执行while()循环
*dataHasMore=响应数据中的true,如果
*我们没有进行固定的迭代。。
*/
/*
让dataHasMore=true;
while(dataHasMore){
等待getEngagements(offsetValue)。然后((数据)=>{
dataHasMore=data.hasMore;
offsetValue=data.offset;
console.log(“新偏移值:”+offsetValue);
})
}
*/
console.log('Done');
}
起动()代码>
这与我曾经拥有的非常接近。距离如此之近,以至于我不太确定以前走这条路线时遗漏了什么。我想我没有在正确的位置设置offsetValue。我也非常感谢你提出的while循环。
(async () => {
const times = Array.from({ length: 4 }, (_, i) => i));
let offset;
for (let i of times) {
offset = await pullWriteData(offset);
}
})();
function 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 => response.data);
}