@kuzubina

Как правильно реализовать ассинхронный цикл в node.js?

Как правильно реализовать ассинхронный цикл?
Есть первый запрос который получает список id и далее необходимо пройтись по очередно по всем id с детальным запросом и чтобы следующая итерация началась только после того как получится детальный запрос и какое-либо действие (к примеру запись его в файл)
есть функция такого типа
axios.get('https://jsonplaceholder.typicode.com/todos/1')
.then(async function (response) {

	const items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

	for await (const item of items) {
		const res = await axios.get(`https://jsonplaceholder.typicode.com/users/${item}`)

		fs.writeFileSync('test.json', JSON.stringify(res.data.phone, null, 2));

	}

  console.log(response.data);
  
})
.catch(function (error) {
  console.log(error);
})
  • Вопрос задан
  • 63 просмотра
Решения вопроса 1
Kozack
@Kozack
Thinking about a11y
Используйте await в обычном цикле. В этом случае все итерации будут последовательными.
const items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

  for (const item of items) {
    const res = await axios.get(`https://jsonplaceholder.typicode.com/users/${item}`) // Ждет заверения запроса

    await fs.promises.writeFile('test.json', JSON.stringify(res.data.phone, null, 2)); // Ждет завершения записи
   
   await ... // Ждет завершения любого промиса
  }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@dimoff66
Кратко о себе: Я есть
Если без блокировки await, то как-то так

const promise = axios.get('https://jsonplaceholder.typicode.com/todos/1')
promise
.then(response => ({ response, items: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] }))
.then(nextThen)
.catch(console.log)

const nextThen = ({ response, items }) => {
  if (!items.length) {
    console.log(response)
    return
  }
  const [nextValue, ...rest] = items
  promise
    .then(item =>  axios.get(`https://jsonplaceholder.typicode.com/users/${item}`))  
    .then(res => {
      fs.writeFileSync('test.json', JSON.stringify(res.data.phone, null, 2))
      return ( { response, items: rest })
    })
    .then(nextThen)
  return nextValue
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы