Javascript 如何将Axios响应用作for循环中的参数?

Javascript 如何将Axios响应用作for循环中的参数?,javascript,for-loop,promise,axios,Javascript,For Loop,Promise,Axios,我正在编写一个脚本,从API检索数据。我需要获取API中的所有数据实例,但API限制我一次只能得到250个结果。响应还为我提供了一个偏移量,我可以在新的API调用中使用它来获得下一组结果。我知道我需要对API进行多少次调用,我的想法是在params中使用一个变量,这样我就可以在每次调用API后更新偏移量。问题总是落在实际设置变量并在循环再次运行时使用它上 我能够运行ajax请求并返回数据,然后将偏移量设置为变量。我尝试创建一个初始API调用,然后返回响应,然后在for循环中的一个新函数中使用该返

我正在编写一个脚本,从API检索数据。我需要获取API中的所有数据实例,但API限制我一次只能得到250个结果。响应还为我提供了一个偏移量,我可以在新的API调用中使用它来获得下一组结果。我知道我需要对API进行多少次调用,我的想法是在params中使用一个变量,这样我就可以在每次调用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;
  });
}
我还在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
请求中的no
offset=
开始,然后接下来的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);
}