[js] SharedWorker 踩坑记

在使用SharedWorker时遇到通信不稳定的问题,原因是初始化时有异步操作,特别是import语句导致的动态获取翻译。由于worker与主线程并行执行,异步的fetch请求可能在onconnected事件触发前完成,引发bug。解决方案是将onconnected设置放在所有异步操作之前,确保正常通信。
摘要由CSDN通过智能技术生成

之前做了个用到SharedWorker的项目,结果发现有时能正常通信,有时又无法通信,断点调试显示连onconnected都没进,排查半天,最后发现是一句简单的import导致的...

SharedWorker在设置onconnected之前,千万不要有异步操作!!!

问题就出在那个import,import的是翻译词典(因为需要多语言支持),被import的js里面用了navigator.languages检测用户的语言,然后动态获取对应翻译;

获取翻译时,使用了 await fetch  (模块顶层可以直接await),导致出现了异步操作,又因为worker使用的是静态import,所以。。。

因为worker是独立的线程,它与主线程并行,各种奇奇怪怪的bug便出现了:

情况1: (开发环境更容易出现)worker里的await fetch先完成了加载(这是有可能的,本地运行服务器延迟很低),并在主线程的 new SharedWorker 返回设置了onconnected处理,主线程紧随其后,调用了worker.port.start(),此时一切正常;

情况2:(生产环境更容易出现)主线程的new SharedWorker已经返回,并调用了port.start();但是此时worker的await fetch还没有返回,顺理成章地,onconnected也没有设置

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值