Задание (Job) — это Абстрактное Замыкание (Abstract Closure) без параметров, которое инициирует вычисление ECMAScript, когда в настоящее время не выполняются никакие другие вычисления ECMAScript.
Задания планируются к выполнению в средах хоста ECMAScript. Эта спецификация описывает обработчик хоста (host hook) HostEnqueuePromiseJob (Задание обещания поставить задание в очередь хоста) для планирования одного вида заданий; хосты могут определять дополнительные абстрактные операции, которые планируют задания. Такие операции принимают в качестве параметра Абстрактное Замыкание Задания и планируют его выполнение в будущем. Их реализации должны соответствовать следующим требованиям:
В какой-то момент времени, когда запущенный контекст выполнения отсутствует и стек контекстов выполнения пуст, реализация должна:
-
- 1. Выполнить все этапы подготовки, определенные хостом.
- 2. Вызвать Задание Абстрактного Замыкания.
- 3. Выполнить все шаги очистки, определенные хостом, после чего стек контекста выполнения должен быть пустым.
Только одно Задание может активно проходить оценку в любой момент времени.
После начала оценки Задания оно должно быть выполнено до завершения, прежде чем начнется оценка любого другого Задания.
Абстрактное Замыкание должно возвращать нормальное завершение, реализуя собственную обработку ошибок.
Хост-среды не обязаны обрабатывать Задания единообразно в отношении планирования. Например, веб-браузеры и Node.js рассматривают задания по обработке обещаний как более высокий приоритет, чем другие работы; будущие функции могут добавлять задания, которым не уделяется такого высокого приоритета.
В любой конкретный момент scriptOrModule (запись сценария, запись модуля или значение null) является активным сценарием или модулем (active script or module), если выполняются все следующие условия:
- 1. GetActiveScriptOrModule() является scriptOrModule.
- 2. Если scriptOrModule является записью сценария или записью модуля, пусть ec будет самым верхним контекстом выполнения в стеке контекстов выполнения, компонент ScriptOrModule которого является scriptOrModule. Компонент Области в ec — это scriptOrModule.[[Realm]].
В любой конкретный момент выполнение готово к оценке кода ECMAScript (prepared to evaluate ECMAScript code), если выполняются все следующие условия:
- Стек контекста выполнения не пуст.
- Компонент Область самого верхнего контекста выполнения в стеке контекста выполнения — это Запись Области.
Среда хоста может подготовить выполнение для оценки кода, помещая контексты выполнения в стек контекстов выполнения. Конкретные шаги определяются реализацией.
Конкретный выбор Области (Realm) зависит от среды хоста. Этот начальный контекст выполнения и Область используются только до вызова какой-либо функции обратного вызова. Когда вызывается функция обратного вызова, связанная с Заданием, такая как обработчик обещаний, вызов подталкивает свой собственный контекст выполнения и Область.
К определенным видам Заданий предъявляются дополнительные требования соответствия.
Записи JobCallback (Обратный вызов Задания)
Запись JobCallback (JobCallback Record) — это значение Записи, используемое для хранения функционального объекта и значения, определенного хостом. Функциональные объекты, которые вызываются через Задание, поставленное в очередь хостом, могут иметь дополнительный определяемый хостом контекст. Для распространения состояния Абстрактные Замыкания Заданий не должны напрямую захватывать и вызывать функциональные объекты. Вместо этого используйте HostMakeJobCallback и HostCallJobCallback.
Спецификация WHATWG HTML (html.spec.whatwg.org), например, использует значение, определяемое хостом, для распространения существующего объекта настроек для обратных вызовов Обещаний (Promise).
Записи JobCallback содержат поля, перечисленные в таблице 28.
Имя поля | Значение | Смысл |
---|---|---|
[[Callback]] | Функциональный объект | Функция, вызываемая при вызове Задания. |
[[HostDefined]] | Любое, значение по умолчанию является empty. | Поле зарезервировано для использования хостами. |
HostMakeJobCallback ( callback )
Определяемая хостом абстрактная операция HostMakeJobCallback принимает аргумент callback (функциональный объект).
Реализация HostMakeJobCallback должна соответствовать следующим требованиям:
- Он всегда должен завершаться нормально (т. е. не возвращать внезапное завершение (abrupt completion)).
- Он всегда должен возвращать запись 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