Как использовать ответ Axios в качестве параметра в цикле for? - PullRequest
1 голос
/ 11 июня 2019

Я работаю над написанием скрипта, который будет извлекать данные из API. Мне нужно получить все экземпляры данных в API, но API ограничивает меня до 250 результатов одновременно. Ответ также дает мне номер смещения, который я могу использовать в новом вызове API для получения следующего набора результатов. Я знаю, сколько вызовов в API мне нужно сделать, и я думал об использовании переменной в параметрах, чтобы я мог обновлять число смещений после каждого вызова 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;
  });
}

этот код возвращает:

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

Я также встроил второй вызов Axios в .then моего вызова pullWriteData (), и это работает, но это определенно противоречит цели написания программы, которая сделает это для меня.

Я ожидаю, что это запустит начальный вызов API, запишет данные в файл, обновит offsetValue, снова выполнит вызов API с новым offsetValue, запишет этот ответ в файл, обновит offsetValue и повторяйте, пока я не соберу все данные.

Что касается записи данных в файл, я уже могу это сделать, используя fs. Это просто получение значения offsetValue для обновления, что, кажется, меня раздражает.

Заранее спасибо за любые рекомендации.

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Используя async/await, вы можете сделать следующее с promises, чтобы убедиться, что вы получаете следующий offset каждый раз и устанавливаете его в цикле так, чтобы следующий цепочечный запрос async проходил новый offset на запрос.

Примечание: что при текущей итерации вы будете делать только 3 запроса, начиная с offset= в запросе GET, а затем в следующих 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>
1 голос
/ 11 июня 2019

Я думаю, вы можете настроить этот пример под свои нужды:


(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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...