ECMAScript | Задания и операции хоста для постановки Заданий в очередь

Задание (Job) — это Абстрактное Замыкание (Abstract Closure) без параметров, которое инициирует вычисление ECMAScript, когда в настоящее время не выполняются никакие другие вычисления ECMAScript.

Задания планируются к выполнению в средах хоста ECMAScript. Эта спецификация описывает обработчик хоста (host hook) HostEnqueuePromiseJob (Задание обещания поставить задание в очередь хоста) для планирования одного вида заданий; хосты могут определять дополнительные абстрактные операции, которые планируют задания. Такие операции принимают в качестве параметра Абстрактное Замыкание Задания и планируют его выполнение в будущем. Их реализации должны соответствовать следующим требованиям:

В какой-то момент времени, когда запущенный контекст выполнения отсутствует и стек контекстов выполнения пуст, реализация должна:

Только одно Задание может активно проходить оценку в любой момент времени.

После начала оценки Задания оно должно быть выполнено до завершения, прежде чем начнется оценка любого другого Задания.

Абстрактное Замыкание должно возвращать нормальное завершение, реализуя собственную обработку ошибок.

Примечание 1

Хост-среды не обязаны обрабатывать Задания единообразно в отношении планирования. Например, веб-браузеры и Node.js рассматривают задания по обработке обещаний как более высокий приоритет, чем другие работы; будущие функции могут добавлять задания, которым не уделяется такого высокого приоритета.

В любой конкретный момент scriptOrModule (запись сценария, запись модуля или значение null) является активным сценарием или модулем (active script or module), если выполняются все следующие условия:

В любой конкретный момент выполнение готово к оценке кода ECMAScript (prepared to evaluate ECMAScript code), если выполняются все следующие условия:

Примечание 2

Среда хоста может подготовить выполнение для оценки кода, помещая контексты выполнения в стек контекстов выполнения. Конкретные шаги определяются реализацией.

Конкретный выбор Области (Realm) зависит от среды хоста. Этот начальный контекст выполнения и Область используются только до вызова какой-либо функции обратного вызова. Когда вызывается функция обратного вызова, связанная с Заданием, такая как обработчик обещаний, вызов подталкивает свой собственный контекст выполнения и Область.

К определенным видам Заданий предъявляются дополнительные требования соответствия.

Записи JobCallback (Обратный вызов Задания)

Запись JobCallback (JobCallback Record) — это значение Записи, используемое для хранения функционального объекта и значения, определенного хостом. Функциональные объекты, которые вызываются через Задание, поставленное в очередь хостом, могут иметь дополнительный определяемый хостом контекст. Для распространения состояния Абстрактные Замыкания Заданий не должны напрямую захватывать и вызывать функциональные объекты. Вместо этого используйте HostMakeJobCallback и HostCallJobCallback.

Примечание

Спецификация WHATWG HTML (html.spec.whatwg.org), например, использует значение, определяемое хостом, для распространения существующего объекта настроек для обратных вызовов Обещаний (Promise).

Записи JobCallback содержат поля, перечисленные в таблице 28.

Имя поля Значение Смысл
[[Callback]] Функциональный объект Функция, вызываемая при вызове Задания.
[[HostDefined]] Любое, значение по умолчанию является empty. Поле зарезервировано для использования хостами.

 

HostMakeJobCallback ( callback )

Определяемая хостом абстрактная операция HostMakeJobCallback принимает аргумент callback (функциональный объект).

Реализация HostMakeJobCallback должна соответствовать следующим требованиям:

  1. Он всегда должен завершаться нормально (т. е. не возвращать внезапное завершение (abrupt completion)).
  2. Он всегда должен возвращать запись JobCallback, поле [[Callback]] которой является обратным вызовом callback.

Реализация HostMakeJobCallback по умолчанию при вызове выполняет следующие шаги:

1. Утверждено: IsCallable(callback) является true.
2. Вернуть запись JobCallback { [[Callback]]: callback, [[HostDefined]]: empty }.

Хосты ECMAScript, не являющиеся веб-браузерами, должны использовать реализацию HostMakeJobCallback по умолчанию.

Примечание

Это вызывается в то время, когда обратный вызов передается функции, которая в конечном итоге отвечает за его планирование и запуск. Например, promise.then(thenAction) вызывает MakeJobCallback для thenAction во время вызова Promise.prototype.then, а не во время планирования реакции Задания.

 

HostCallJobCallback ( jobCallback, V, argumentsList )

Определяемая хостом абстрактная операция HostCallJobCallback принимает аргументы jobCallback (запись JobCallback), V (значение языка ECMAScript) и argumentsList (список значений языка ECMAScript).

Реализация HostCallJobCallback должна соответствовать следующим требованиям:

  • Он всегда должен выполнять и возвращать результат вызова Call(jobCallback.[[Callback]], V, argumentsList).
Примечание

Это требование означает, что хосты не могут изменять поведение [[Call]] функциональных объектов, определенных в этой спецификации.

Реализация HostCallJobCallback по умолчанию при вызове выполняет следующие шаги:

1. Утверждено: IsCallable(jobCallback.[[Callback]]) истинно true.
2. Вернуть ? вызов Call(jobCallback.[[Callback]], V, argumentsList).

Хосты ECMAScript, не являющиеся веб-браузерами, должны использовать реализацию HostCallJobCallback по умолчанию.

 

HostEnqueuePromiseJob ( job, realm )

Определяемая хостом абстрактная операция HostEnqueuePromiseJob принимает аргумент задания job (абстрактное замыкание задания) и область realm (запись области или значение null). Он планирует выполнение job в будущем. Абстрактные Замыкания, используемые с этим алгоритмом, предназначены для связи с обработкой обещаний или иным образом для планирования с равным приоритетом операциям обработки обещаний.

Реализация HostEnqueuePromiseJob должна соответствовать требованиям 9.4, а также следующим:

  • Если область realm не равна нулю, каждый раз при вызове Задания job реализация должна выполнять определенные реализацией шаги, чтобы выполнение было подготовлено для оценки кода ECMAScript во время вызова задания job.
  • Пусть scriptOrModule будет GetActiveScriptOrModule() во время вызова HostEnqueuePromiseJob. Если область realm не равна null, каждый раз при вызове задания реализация должна выполнять определенные реализацией шаги, так что scriptOrModule является активным сценарием или модулем во время вызова задания job.
  • Задания должны выполняться в том же порядке, что и вызовы HostEnqueuePromiseJob, которые их запланировали.
Примечание

Область realm для Заданий, возвращаемая NewPromiseResolveThenableJob, обычно является результатом вызова GetFunctionRealm для функционального объекта then. Область realm для Заданий, возвращаемая NewPromiseReactionJob, обычно является результатом вызова GetFunctionRealm в обработчике, если обработчик не является undefined. Если обработчик является undefined, область realm является null. Для обоих типов Заданий, когда GetFunctionRealm завершается ненормально (то есть вызывается на отозванном прокси (Proxy)), область realm является текущей областью на момент вызова GetFunctionRealm. Когда область realm равна null, никакой пользовательский код ECMAScript не будет оцениваться, и не будут созданы новые объекты ECMAScript (например, объекты ошибок Error). Например, спецификация WHATWG HTML (https://html.spec.whatwg.org/) использует область realm для проверки возможности запуска сценария и концепции входа.

 

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

Предыдущая тема — ECMAScript | Контексты Выполнения

Стандарт ECMAScript — Раздел «9.4 Jobs and Host Operations to Enqueue Jobs» — https://tc39.es/ecma262/#sec-jobs

 

 

Поделись записью