Нет - jQuery .each
работает аналогично forEach
. Каждый обратный вызов будет запускаться один за другим, и если обратный вызов возвращает Promise (например, если это асиновая c функция), его не будут ждать - он работает аналогично
callback();
callback();
callback();
Если что-то в обратном вызове не блокирует (чего не следует делать, если вы используете приличные методы программирования), ничто из асинхронного инициализированного в обратном вызове не может привести к дальнейшим обратным вызовам, ожидающим завершения этого асинхронного действия.
Но jQuery объекты являются итеративными, поэтому тривиально использовать for..of
для итерации по элементам просто:
const sleep = ms => new Promise(res => setTimeout(res, ms));
(async () => {
for (const elm of $("div")) {
console.log("The content is: " + $(elm).text());
await sleep(1000);
}
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>text 1</div>
<div>text 2</div>
<div>text 3</div>
Это совсем не многословно IMO.
Для использования await
в al oop, l oop либо должен быть for
l oop (либо for..in, for..of, либо for (let i = ...), либо итерационный механизм l oop должен быть построен так, чтобы он ожидает разрешения последнего обратного вызова, например, с reduce
:
const sleep = ms => new Promise(res => setTimeout(res, ms));
[...$("div")].reduce(async (lastProm, elm) => {
await lastProm;
console.log("The content is: " + $(elm).text());
await sleep(1000);
}, Promise.resolve());
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>text 1</div>
<div>text 2</div>
<div>text 3</div>
Примечание, о котором едва ли стоит упоминать - ранее я говорил, что использование await
внутри .each
не будет работать
Если что-то в обратном вызове блокирует (чего не должно быть, если вы используете приличные методы программирования)
Если вы пишете дорогую и глупую блокирующую версию sleep
, который потребляет все ресурсы, пока не будет достигнута следующая секунда, «можно» ждать внутри l oop, но этого не следует делать:
const sleep = ms => {
const now = Date.now();
while (Date.now() - now < ms) {}
}
Работать будет намного лучше с обещаниями правильно.