ECMAScript | Запись о Завершении | Тип спецификации

ECMAScript | Запись о Завершении | Тип спецификации

Тип Завершения (Completion type) — это Запись, используемая для объяснения распространения значений и потока управления во время выполнения, например поведения операторов (break, continue, return и throw), которые выполняют нелокальную передачу управления.

Значения типа Завершение (Values of the Completion type) — это значения Записей, поля которых определены в Таблице 9. Такие значения называются Записями о  Завершении (Completion Records).

 

Field Name (Имя Поля) Value (Значение) Meaning (Смысл)
[[Type]] Один из normal, break, continue, return, throw Тип произошедшего завершения.
[[Value]] любое значение языка ECMAScript или empty Значение, которое было произведено.
[[Target]] любая строка ECMAScript или empty Целевая метка для направленных передач управления.

Таблица 9: Поля записи о завершении

 

Следующие сокращённые термины иногда используются для обозначения Завершений.

  • Нормальное Завершение (normal completion) относится к любому завершению со значением поля [[Type]] — normal.
  • Прерванное Завершение (break completion) относится к любому завершению со значением поля [[Type]] — break.
  • Продолженное Завершение (continue completion) относится к любому завершению со значением поля [[Type]] — continue.
  • Возвратное Завершение (return completion) относится к любому завершению со значением поля [[Type]] — return.
  • Брошенное Завершение (throw completion) относится к любому завершению со значением поля [[Type]] — throw.
  • Внезапное Завершение (abrupt completion) относится к любому завершению со значением поля [[Type]], отличным от normal, то есть с полем [[Type]] — break, continue, return, throw,

Вызываемые объекты, определенные в этой спецификации, возвращают только Нормальное Завершение или Брошенное Завершение. Возврат любого другого вида завершения считается редакционной ошибкой.

Вызываемые объекты, определенные реализацией, должны возвращать либо Нормальное Завершение, либо Брошенное Завершение.

 

6.2.3.1 Await

Шаги алгоритма Ожидания (Await), которые говорят

1. Пусть завершение completion будет Await(value).

означают то же, что и:

1. Пусть asyncContext будет текущим контекстом выполнения.
2. Пусть обещание promise будет ? PromiseResolve(%Promise%, value).
3. Допустим, что finishedClosure будет новым Абстрактным Замыканием с параметрами (value), которое захватывает asyncContext и при вызове выполняет следующие шаги:
  а. Пусть prevContext будет текущим контекстом выполнения.
  b. Приостановить prevContext.
  c. Поместите asyncContext в стек контекста выполнения; asyncContext теперь является текущим контекстом выполнения.
  d. Возобновите приостановленную оценку asyncContext с помощью NormalCompletion(value) как результат операции, которая приостановила его.
  e. Утверждено: когда мы достигаем этого шага, asyncContext уже был удален из стека контекста выполнения, а prevContext - это текущий контекст выполнения.
  f. Вернуть undefined.
4. Пусть onFulfilled будет ! CreateBuiltinFunction(fulfilledClosure, 1, "", «»).
5. Пусть rejectedClosure будет новым Абстрактным Замыканием с параметрами (reason), которое захватывает asyncContext и при вызове выполняет следующие шаги:
  а. Пусть prevContext будет текущим контекстом выполнения.
  b. Приостановить prevContext.
  c. Поместите asyncContext в стек контекста выполнения; asyncContext теперь является текущим контекстом выполнения.
  d. Возобновите приостановленную оценку asyncContext с помощью ThrowCompletion(reason) в результате операции, которая приостановила ее.
  e. Утверждено: когда мы дойдем до этого шага, asyncContext уже удален из стека контекста выполнения, а prevContext - это текущий выполняющийся контекст.
  f. Вернуть undefined.
6. Пусть onRejected будет ! CreateBuiltinFunction(rejectedClosure, 1, "", «»).
7. Выполнить ! PerformPromiseThen(promise, onFulfilled, onRejected).
8. Удалите asyncContext из стека контекста выполнения и восстановите контекст выполнения, который находится наверху стека контекста выполнения, в качестве текущего контекста выполнения.
9. Установите состояние оценки кода asyncContext таким образом, чтобы при возобновлении оценки с Завершением completion выполнялись следующие шаги алгоритма, вызвавшего Await, с доступным completion.
10. Вернуть
11. ПРИМЕЧАНИЕ. При этом выполняется возврат к оценке операции, в которой оценка asyncContext наиболее ранее возобновлялась.

где все псевдонимы на вышеупомянутых шагах, за исключением завершения completion, эфемерны и видны только на шагах, относящихся к Await.

Примечание

Await можно комбинировать с префиксами ? а также !, так что например

1. Пусть результатом result будет ? Await(value).

означает то же, что и:

1. Пусть результатом result будет Await(value).
2. ReturnIfAbrupt(result).

 

6.2.3.2 NormalCompletion ( value )

Абстрактная операция NormalCompletion принимает аргумент value. При вызове она выполняет следующие шаги:

1. Вернуть Завершение { [[Type]]: normal, [[Value]]: value, [[Target]]: empty }.

 

6.2.3.3 ThrowCompletion ( value )

Абстрактная операция ThrowCompletion принимает аргумент value (значение языка ECMAScript). При вызове она выполняет следующие шаги:

1. Вернуть Завершение { [[Type]]: throw, [[Value]]: value, [[Target]]: empty }.

 

6.2.3.4 UpdateEmpty ( completionRecord, value )

Абстрактная операция UpdateEmpty принимает аргументы completionRecord и value. При вызове она выполняет следующие шаги:

1. Утверждено: если completionRecord.[[Type]] либо return, либо throw, то completionRecord.[[Value]] не является empty.
2. Если completionRecord.[[Value]] не является empty, вернуть Завершение(completionRecord).
3. Вернуть Завершение {[[Type]]: completionRecord.[[Type]], [[Value]]: value, [[Target]]: completionRecord.[[Target]]}.

 

Информационные ссылки

Стандарт ECMAScript — Раздел «6.2.3 The Completion Record Specification Type» — https://tc39.es/ecma262/#sec-completion-record-specification-type