Недавно я попытался выяснить, как работают обещания в ECMAScript. Больше всего интересует конструкция AwaitExpression. На мой взгляд, это самое непонятное и довольно сложное в спецификации.
Позвольте мне привести код:
/// Promise
var promiseA = new Promise((resolve, reject) => {
setTimeout(() => resolve("Done!"), 10000)
});
/// Async/Await
(async function(){
var result = await promiseA;
console.log(result); /// Output: "Done!"
})();
/// Promise.prototype.then
promiseA.then(function (result){
console.log(result); /// Output: "Done!"
});
Для меня, как я уже сказал выше, AwaitExpression непостижимо, я не понимаю, куда идет возврат значения из обещания. Но я понимаю, откуда берется значение из [[PromiseResult]] и как значение [[PromiseResult]] из .then передается в аргумент функции обратного вызова.
И есть некоторые шаги, которые, к сожалению,мне не понятно от Await () :
Удалите asyncContext из стека контекста выполнения и восстановите контекст выполнения, находящийся на вершине стека контекста выполнения, в качестве контекста выполнения выполнения. Установите состояние оценки кода asyncContext таким образом, чтобы при возобновлении оценкис завершением Завершения будут выполнены следующие шаги алгоритма, который вызвал Await, с доступным завершением. Возврат. ПРИМЕЧАНИЕ: Это возвращает к оценке операции, которая имела место ранееВозобновленная оценка asyncContext.
И часть действий из Ожидающих выполненных функций все еще не совсем ясна:
Возобновить приостановленную оценку asyncContext, используя NormalCompletion (значение) в результате операции, которая приостановила его. Утверждение: Когда мы достигаем этого шага, asyncContext уже был удален из стека контекста выполнения и prevContextявляется текущим контекстом выполнения. Возврат не определен.
PS Как выполняются Promise и .then ясномне, вы можете принять это во внимание при объяснении AwaitExpression.