Как запустить цикл `for...of` для перебора элементов массива определенной длины?

Как сделать так, чтобы в цикле <code>for</code> можно было использовать ожидание <code>await</code>? <br/> В описании циклов упоминается, что <code>await</code> может применяться только с <code>for of</code>, но в моем случае необходимо выполнить цикл определенное количество раз, а не по элементам массива. <br/> Могу ли я как-то обойтись без создания дополнительного массива и заставить <code>for of</code> выполниться определенное количество раз, или же существует способ внедрить <code>await</code> в обычный цикл <code>for</code>?
  • 9 октября 2024 г. 15:34
Ответы на вопрос 4
Да, вы можете использовать цикл `for` с `await`, если он обернут в асинхронную функцию. Вот несколько способов, как можно реализовать ожидание в цикле, когда вам нужно перебрать элементы определенного количества раз.

### 1. Использование `for ... of` с массивом заданной длины

Вы можете создать массив на лету, используя метод `Array.from()`, чтобы сгенерировать массив нужной длины, а затем использовать `for ... of` для итерации:

```javascript
async function example() {
    const length = 5; // длина цикла
    const array = Array.from({ length }, (_, i) => i); // создаем массив [0, 1, 2, 3, 4]

    for (const i of array) {
        await new Promise(resolve => setTimeout(resolve, 1000)); // имитация асинхронной операции
        console.log(i);
    }
}

example();
```

### 2. Использование обычного цикла `for`

Вы также можете использовать обычный цикл `for`, так как он также может использовать `await`, если находится внутри асинхронной функции:

```javascript
async function example() {
    const length = 5; // длина цикла

    for (let i = 0; i < length; i++) {
        await new Promise(resolve => setTimeout(resolve, 1000)); // имитация асинхронной операции
        console.log(i);
    }
}

example();
```

Оба метода позволят вам использовать `await` для асинхронных операций внутри цикла. Выбор между ними зависит от вашего предпочтения и читаемости кода.
Обычный цикл чем не цикл? 
const chain = async times => {
  for (let n = times; n > 0; n--) {
    console.log(`${n} starting..`);
    await new Promise(resolve => setTimeout(resolve, 800));
    console.log(`${n} ..finished`);
  }
};

chain(4).then(() => console.log('Done'));
const something = async _ => new Promise(resolve => setTimeout(resolve, 100));

const asyncRecursive = async (limit, count = 0) => {
  await something();
  console.log(count);
  count+=1;
  if (count < limit) {
    await asyncRecursive(limit, count);
  }
}

let limit = 10;

(async function() {
  for(let n of Array.from(Array(limit).keys())) {
    await something();
    console.log(n);
  }
  
  await asyncRecursive(limit);
})();
Как написано в описании циклов, с await может работать только for of
В каком описании? С await прекрасно работает классический for.
function sleep(delayms) {
  return new Promise((resolve) => setTimeout(() => resolve(), delayms));
}
async function foo() {
  for (i = 0; i < 10; i += 1) {
    await sleep(1000);
    console.log(i);
  }
  return 'done';
}
await foo();
// 0
// 1
// ...
// 9
// "done"
Похожие вопросы