Синхронность циклов for ... await в JavaScript
Я пытаюсь представить синхронность for...await
циклы в JavaScript.
Похоже, что в async
функция генератора как yield
а также await
остановит прогресс и вызовет продолжение микрозадачи.
Другими словами: уступка всегда асинхронна в этом контексте, даже если вы не используетеawait
ключевое слово.
Это правильно? Как насчетasync
генератор функций вне контекста for...await
петли?
Ниже создается плотный цикл микрозадач с использованием then
, чтобы увидеть, как чередуются задачи.
function printNums() {
let counter = 0
function go() {
console.log(counter++)
if(counter < 10) Promise.resolve().then(go)
}
Promise.resolve().then(go)
}
printNums()
async function asyncFn() {
console.log('inside asyncFn 1')
await null
console.log('inside asyncFn 2')
}
asyncFn()
const asyncIterable = {
async *[Symbol.asyncIterator]() {
console.log('inside asyncIterable 1')
yield '⛱'
console.log('inside asyncIterable 2')
await null
console.log('inside asyncIterable 3')
yield ''
yield ''
}
}
async function printAsyncIterable() {
for await(let z of asyncIterable) {
console.log(z)
}
}
printAsyncIterable()
1 ответ
Другими словами: уступка всегда асинхронна в этом контексте, даже если вы не используете
await
ключевое слово
Да. Внутри функции асинхронного генератора выражение
yield value
ведет себя так, как будто вы написали
await (yield (await value))
Вы не можете давать обещания, и вы не можете получать обещания, они всегда автоматически разворачиваются. next()
вызов.