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

时间:2019-06-11 17:45:25

标签: javascript for-loop promise axios

我正在编写一个脚本,该脚本将从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;
  });
}

此代码返回:

New offset value: 12345678
New offset value: 12345678
New offset value: 12345678

我还在我的pullWriteData()调用的.then中建立了第二个Axios调用,该调用是有效的,但肯定会破坏编写程序来为我执行此操作的目的。

我期望这将运行初始API调用,将数据写入文件,更新offsetValue,使用新的offsetValue再次运行API调用,并将响应写入文件,更新offsetValue并重复执行,直到提取所有数据为止。

就将数据写入文件而言,我已经可以使用fs来做到这一点。只是让offsetValue值更新似乎让我感到困扰。

谢谢您的指导。

2 个答案:

答案 0 :(得分:1)

我认为您可以根据需要调整此示例:


(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);
}

答案 1 :(得分:1)

使用async/await,可以对promises进行以下操作,以确保每次获取下一个offset并将其设置在循环中,以便下一个链接的{{1} }请求将新的async传递给该请求。

注意:在您当前的迭代中,您只会发出3个请求,从offset请求中没有offset=开始,然后接下来的2个请求将使用分别从第一个和第二个请求返回的GET值,并且不使用第三个返回的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();