navigator.serviceWorker.register('/sw.js').then((reg)=>{
console.log(reg.installing, " installing");
console.log(reg.waiting, " waiting");
console.log(reg.active, " active")
reg.addEventListener('updatefound', function(){
console.log("update found", reg.installing);
})
})
情况A)假设用户是第一次访问我的网站。 reg.installing
打印worker
对象。 reg.waiting
和reg.active
未定义,这是可以理解的。 updatefound
立即运行,reg.installing
与上述工人相同。一切都很好。
案例B)我更新了SW代码并进行了部署。刷新页面时,reg.installing
打印未定义。 问题1)为什么未定义?刷新后,将出现新的服务程序,但reg.installing
未定义。如果是A,则当浏览器访问该网站时,必须安装新的服务人员,因此reg.installing
并非未定义。
[我的假设:在案例B中,我认为then promise block
的发生速度快于浏览器将旧的与新的进行比较的速度,因此,发生这种情况时,浏览器根本没有reg.installing
。在案例A中,因为这是第一次,浏览器无需进行任何比较,而且速度更快,可以将worker
放入reg.installing
。
问题2)我的假设有意义吗?
强烈建议阅读“ The Service Worker Lifecycle”以获取深入的背景信息。
服务工作者的生命周期独立于客户端页面上的任何活动而发生,并且在您的代码执行时,是的,更新的服务工作者完全有可能从installing
状态移至waiting
状态(或[ C0],如果您已呼叫active
。
所以是的,您的假设听起来基本上是正确的。