服务工作者中能够和不能够完成的任务有哪些限制?

11

根据Can I http poll or use socket.io from a Service Worker on Safari iOS?,服务工作者可以做什么和不能做什么?上面提到的答案指出:“您不能...与服务器建立任何类型的打开连接”,这很有道理,但是这个限制在哪里得到了记录,并且如何执行这个限制?

例如,某些浏览器API对服务工作者不可用吗?或者是否有执行配额防止长时间运行的进程?

例如,如果我的服务工作者有... setInterval (() => {console.log('foo'), 1000}) ...它会抛出异常吗? 它会运行然后失败吗? 行为取决于浏览器吗?


肯定是依赖于浏览器,也可能依赖于系统资源。我从未见过当前行为的明确列表,但见证了各种各样的事情。例如,在桌面版Chrome中,我曾经看到服务工作者在几秒钟内被终止,有些则持续数小时。 - Brad
虽然我很想看到一个清单,列出每个限制,甚至更好的是像 caniuse 那样进行测试,但我认为期望这样的清单相当不现实。如果您有这样的清单或正在工作的资源,请发布一份清单。 - user120242
2个回答

4

Service Workers仅处理附加的事件。这些事件需要由外部某个脚本注册。在某些情况下,甚至不能延迟执行,例如在Safari浏览器中,Event.waitUntil(promise)不被支持。

一旦事件队列为空,用户代理将决定是否终止Service Workers。此后不能保证任何操作都会被执行。


你是在说任何异步操作都不能保证成功,因为它们在事件循环之外执行吗? - pinoyyid
不,使用Promise的异步调用是可以的。这取决于浏览器 - 重新启动新的异步调用可能不行。而且Safari甚至不支持waitUntil。 - muzzletov
那么,例如,如果SW中的事件处理程序调用setTimeout(()=>{console.log('foo')}, 1000),只要它被包装在Promise中,那就没问题了?那setTimeout(()=>{console.log('foo')}, 1000*60*60)setInterval(()=>{console.log('foo')}, 1000)呢?注意:我不一定要做这些事情。我的问题是要了解什么可以工作,什么不能工作的列表在哪里定义。 - pinoyyid
我已经授予了悬赏,因为否则它将被取消。然而,我还没有接受答案,因为我希望有一个权威的来源来说明什么可以使用,什么不可以使用,而不是仅仅说明它们应该或不应该用于什么。 - pinoyyid
这个问题似乎是要用于几乎所有事情,同时却又什么都不是。它能通过桌面通知获取有关更改、区块链等方面的信息。但这些信息是由事件触发的。目前来看,这似乎更像是一种探索性质的东西,而不是具有实际使用案例的工具。因此,我想每个用户代理应该会自行决定是否使用它。 - muzzletov

0
一个service worker不仅仅是另一个线程,而是一种非常特殊的线程。它的作用是拦截网络和资源获取请求,并对其进行处理。在最基本的形式下,如果网络不可用,它可以缓存数据。此外,它还可以返回与所请求的资源不同的资源,旧版本或占位符等。
例如,如果我的service worker有一个代码段:setInterval (()=>{console.log('foo'), 1000}),它会发生异常吗?会先运行然后失败吗?这取决于浏览器的行为。
它可能会正常工作。然而,做这个的意义很小,因为你既没有DOM访问权限,也无法直接与用户交互。最多,你可以打印出错误和警告,但我不知道哪种警告需要间隔轮询。
从问题中可以看出,你似乎想要在不阻塞主线程的情况下完成一些后台工作。在这种情况下,更通用的类型(Worker API)是你的朋友。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接