Каковы ограничения на то, что можно, а что нельзя делать в сервис-воркере? - PullRequest
11 голосов
/ 05 мая 2020

В дополнение к Могу ли я http-опрос или использовать socket.io из Service Worker в Safari iOS? каков список того, что можно и что нельзя делать в Service Worker? В приведенном выше ответе говорится: «Вы не можете ... иметь какое-либо открытое соединение с вашим сервером», что имеет смысл, но где этот факт задокументирован и как применяется ограничение?

Например, уверены API браузера недоступны для сервис-воркеров? или существует квота выполнения, которая предотвращает длительный процесс?

Например. если у моего сервис-воркера есть ... setInterval (()=>{console.log('foo'), 1000}) ... будет ли он генерировать исключение ?, он запустится, а затем завершится неудачно? зависит ли поведение браузера?

Ответы [ 2 ]

4 голосов
/ 12 мая 2020

Service Workers должны обрабатывать только присоединенные события. И они должны быть зарегистрированы каким-то скриптом извне. В некоторых случаях в Safari не поддерживается даже задержка выполнения - Event.waitUntil (обещание).

Как только ваша очередь событий опустеет, ваш пользовательский агент должен решить, убивает ли он службу. Нет никакой гарантии, что с тех пор что-нибудь будет выполнено.

0 голосов
/ 12 мая 2020

A Service worker - это не просто еще один поток, а очень специфический тип потока c. Поскольку он предназначен для перехвата запросов на извлечение сети и ресурсов и что-то с ними делать. В своей основной форме c он кэширует, если сеть недоступна, но также может возвращать ресурс, отличный от запрошенного, более старую версию или заполнитель и т. Д. c.

Например. если у моего сервис-воркера ... setInterval (()=>{console.log('foo'), 1000}) ... будет ли это исключение? он будет работать, а затем потерпит неудачу? зависит ли поведение браузера?

Вероятно, это сработает. Однако в этом очень мало смысла, поскольку у вас нет доступа к DOM и вы не можете напрямую взаимодействовать с пользователем. Самое большее, вы можете распечатать ошибки и предупреждения, хотя я не знаю, какое предупреждение потребует интервального опроса.

Судя по вопросу, похоже, вы пытаетесь выполнить sh некоторую фоновую работу, не блокируя основной нить. В этом случае вам подойдет более общий тип c ( Worker API ).

...