Почему я могу использовать ключевое слово await внутри цикла for ... - PullRequest
2 голосов
/ 24 апреля 2020

РЕДАКТИРОВАТЬ: Пожалуйста, прочитайте внимательно. Это работает . Я пытаюсь точно понять, почему.

РЕДАКТИРОВАТЬ 2: Я знаю, что asyn c делает вещи асинхронными. Почему бы это не сработало для for ... in l oop, хотя?

Я использую Node v10.13.0.

Уже некоторое время я использую for. ..of циклов в Javascript для выполнения асинхронных c задач внутри структуры oop. Я не сомневаюсь, что он работает, как ожидалось.

Я просто наткнулся на ситуацию, в которой мне нужно объяснить , почему это работает, и понял, что на самом деле понятия не имею. Вот замысловатый пример, просто чтобы помочь визуализировать, что я имею в виду:

async function myFunc(array) {
    for (var item of array) {
        await asyncRequest();
    }
}

В этой функции не имеет значения, что такое array и asyncRequest, смысл в том, что для каждого элемента в массив, выполнение программы выполняет каждый asyncRequest, казалось бы, последовательно, прежде чем пройти мимо l oop.

Я посмотрел на https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of, где я обнаружил, что для. .. of l oop перебирает итерируемые объекты. Что ж, массив определенно повторяется, но этот факт кажется не связанным.

Любое понимание этого поведения?

1 Ответ

1 голос
/ 24 апреля 2020

Механизм async и await реализован путем объединения Promises с функциями генератора. Каждый await внутри функции async подобен yield в генераторе. Преобразование кода обрабатывается, когда код анализируется, поэтому вам не нужно возиться со всем этим самостоятельно.

Это означает, что внутри функции async может появиться await везде : как вы знаете, внутри циклов for ... of, но также внутри циклов for ... in, простых старых циклов for, циклов while и т.д. Если вы прочитаете о функциях генератора, вы увидите, что в некотором смысле это точно параллельно, yield может появиться где угодно. Так что for ... of циклы ни в коем случае не являются особыми, и (как вы подозреваете) их поведение и семантика не имеют ничего общего с тем, что означает await внутри тела такого al oop.

...