Как сделать так, чтобы в цикле <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>?
Да, вы можете использовать цикл `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` для асинхронных операций внутри цикла. Выбор между ними зависит от вашего предпочтения и читаемости кода.
Обычный цикл чем не цикл? <br/> <pre><code class="javascript">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'));</code></pre>
<pre><code class="javascript">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);
})();</code></pre>
<blockquote>Как написано в описании циклов, с await может работать только for of</blockquote> В каком описании? С await прекрасно работает классический for. <br/> <pre><code class="javascript">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"</code></pre>