2016-10-12 1 views
6

При использовании Javascript-обещаний блокируется ли цикл событий?Предоставляет ли Javascript блокировку стека

Мое понимание заключается в том, что с использованием ожидания асинхронизации & async блокирует стоп до завершения операции. Делает ли это это, блокируя стек или он действует подобно обратному вызову и процессу процесса в API рода?

+1

Мое понимание заключается в том, что в этом смысл обещания. – Feathercrown

+0

* «он действует аналогично обратному вызову». * В общем смысле обратный вызов может быть вызван асинхронно * или * синхронно в зависимости от контекста. Но вся суть обещаний - разрешить асинхронные (неблокирующие) операции. – nnnnnn

+0

Нет «стека» в том смысле, что вы, кажется, используете его. Я думаю, вы имеете в виду «цикл событий». Возможно, вы должны отредактировать свой титул, а также тело вашего вопроса. –

ответ

6

При использовании Javascript-обещаний блокируется ли цикл событий?

Нет. Обещания - это только система уведомления о событиях. Это не сама операция. Они просто отвечают на то, чтобы быть разрешенными или отклоненными, вызвав соответствующие обработчики .then() или .catch(), и если они связаны с другими обещаниями, они могут отсрочить вызов этих обработчиков до тех пор, пока обещания, которые они прикованы, также не разрешат/отклоняют. Поскольку такое обещание ничего не блокирует и, конечно же, не блокирует цикл событий.

Я понимаю, что с помощью Await & асинхр, делает стек остановки , пока операция не будет завершена. Это делает это, блокируя стек или он действует аналогично обратному вызову и проходу процесса до API-типа?

await просто синтаксический сахар, который заменяет .then() обработчик с синтаксисом немного проще. Но под крышкой операция такая же. Код, который появляется после await, в основном помещается внутри невидимого обработчика .then(), и нет блокировки цикла событий, так же как нет блокировки с обработчиком .then().

4

await блокирует только текущий async function, цикл событий продолжает работать нормально. Когда обещание оседает, выполнение тела функции возобновляется там, где оно прекращается.

Каждый async/await может быть преобразован в эквивалентную программу .then(…) -callback и работает именно так с точки зрения параллелизма. Таким образом, пока обещание await ed, возможны другие события, и может выполняться любой другой код.

+4

«Ожидание блокирует только текущую функцию асинхронизации» --- Я думаю, что ему нужна лучшая формулировка, «блокирует» здесь это сбивает с толку. – zerkms

+0

@zerkms Любые предложения? На самом деле я думаю: «[блокировка] (https://en.wikipedia.org/wiki/Blocking_ (вычисления))» вполне подходит, если вы рассматриваете каждый вызов функции «async» для создания задачи/процесса. – Bergi

+0

Возможно. Вся концепция 'async/await' - это не самая легкая вещь, которая объясняет и делает это с правильными словами по моим языковым возможностям. – zerkms