javascript - 如何使用 Axios 响应作为 for 循环中的参数?

标签 javascript for-loop promise axios

我正在编写一个将从 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/

相关文章:

delphi - 在Delphi中使用变量作为对象名称

javascript - 等待可选的 promise 和存储值

javascript - 处理 Promise 链中的错误

javascript - 将 JavaScript 组件包含到 Blazor 组件中

javascript - 带有 es6 import 的包装函数,不需要变量名(用于 React 高阶组件)

python - for循环中的if-else在python中不起作用

node.js - 等待 promise 的 fs.writeFile 与 fs.writeFileSync

javascript - 检查 javascript 变量是否为数字且大于零的最简单方法是什么?

javascript - 在 Google Maps Places API 中更改默认文本 "Enter a Location"

bash - 将数字范围读入for循环