Я пытаюсь обернуть функцию self.setTimeout () внутри веб-работника (поэтому нет собственного оконного объекта). Я подумал, что было бы довольно просто использовать синтаксис метода apply:
window.setTimeout = function ( /**/) {
return setTimeout.apply(self,arguments);
};
Этот вызов должен быть эквивалентен вызову self.setTimeout () с любым количеством аргументов (функция, задержка, аргументы для передачи в функция) и возвращает идентификатор для тайм-аута.
Однако средняя строка кода в конечном итоге выдает ошибку "слишком много рекурсии". Похоже, что вызов этого кода каким-то образом нарушает описанный здесь механизм c: Будет ли рекурсивный вызов функции 'setTimeout' в конечном итоге уничтожить JS Engine? , который разрушает предыдущий контекст функции и делает его фактически рекурсивным. На всякий случай, это спецификация браузера c: протестировано в Firefox 74.0 (64-бит).
Некоторый фон
На всякий случай, если кому-то интересно почему я пытаюсь это сделать:
Я хочу переместить некоторый загруженный процессором код из основного потока веб-работникам без переписывания всего.
К сожалению, код опирается на некоторую библиотеку, которая в Поворот полагается на наличие окна и документа, иначе он не будет инициализирован.
В качестве обходного пути я использую Mock Dom внутри рабочего. Поскольку я на самом деле не хочу делать манипуляции с DOM, я просто добавляю любые функции, отсутствующие в mock dom, самым простым способом. Но по какой-то причине библиотека в какой-то момент явно вызывает window.setTimeout (), а не просто setTimeout () - поэтому мне нужно добавить эту функцию в объект фиктивного окна, и она должна работать правильно.
Обновление
Спасибо Александру Сенгесу за указание на ошибку, которую эта функция на самом деле будет вызывать сама.
Решение внутри работающего веб-приложения:
window.setTimeout = function ( /**/) {
return DedicatedWorkerGlobalScope.prototype.setTimeout.apply(self,arguments);
};
Итак, мне нужно написать весь путь функции, чтобы не вызывать себя из window.setTimeout.
Обновление 2
На самом деле, как другой ответ Кайидо указал, что моя оригинальная идея должна была работать нормально сама по себе. Причина, по которой произошло слишком много рекурсии, заключалась в том, что я допустил ошибку в какой-то другой части кода, которая эффективно скопировала self.setTimeout = window.setTimeout
- таким образом, вызывая setTimeout===self.setTimeout===window.setTimeout
, поэтому функция window.setTimeout внезапно стала рекурсивной без намерения.