Синхронность циклов 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() вызов.

Другие вопросы по тегам