Подтвердить что ты не робот

Почему javascript ES6 Promises продолжает выполнение после разрешения?

Как я понимаю, обещание - это то, что может разрешить() или reject(), но я был удивлен, узнав, что этот код в обещании продолжает выполняться после вызова разрешения или отклонения.

Я считал, что решение или отказ от использования async-friendly версии выхода или возврата, что остановит все немедленное выполнение функции.

Может кто-нибудь объяснить мысль, почему следующий пример иногда показывает console.log после вызова разрешения:

var call = function() {
    return new Promise(function(resolve, reject) {
        resolve();
        console.log("Doing more stuff, should not be visible after a resolve!");
    });
};

call().then(function() {
    console.log("resolved");
});

jsbin

4b9b3361

Ответ 1

В JavaScript есть концепция "выполнить до завершения" . Если не возникает ошибка, функция выполняется до тех пор, пока не будет достигнут оператор return или его конец. Другой код вне функции не может помешать этому (кроме случаев, когда возникает ошибка).

Если вы хотите, чтобы resolve() покинул вашу функцию инициализации, вы должны добавить ее к return:

return new Promise(function(resolve, reject) {
    return resolve();
    console.log("Not doing more stuff after a return statement");
});

Ответ 2

Обратные вызовы, которые будут вызваны, когда вы resolve обещание по-прежнему требуется, чтобы спецификация была вызвана асинхронно. Это необходимо для обеспечения согласованного поведения при использовании promises для сочетания синхронных и асинхронных действий.

Поэтому, когда вы вызываете resolve, обратный вызов ставится в очередь, а выполнение функции немедленно продолжается с помощью любого кода, следующего за вызовом resolve().

Только после того, как цикл JS-событий будет предоставлен обратно, можно будет удалить обратный вызов из очереди и фактически вызвать.