Worker、消息与共享内存:练习答案
Worker 生命周期与消息协议
Worker 文件监听 { type: 'square', requestId, value },页面只接受相同 requestId 的结果;pagehide 调用 terminate()。输入 7 的可观察结果是 result 49,刷新后旧 Worker 不再写页面。没有 requestId 时并发结果可能绑定到错误输入。
structured clone 与 Transferable
不带 transfer list 发送 ArrayBuffer 后,主线程 byteLength 仍为 8,Worker 收到独立副本;带 [buffer] 发送后,主线程 byteLength 变为 0,Worker 拥有原缓冲区。转移后继续 new Uint8Array(buffer) 应被视为错误路径,代码应在转移前完成主线程读写。
SharedArrayBuffer 与 Atomics 边界
cross-origin isolated 页面中,两个 Worker 对同一个 Int32Array 各递增 100 次,最终 Atomics.load(counter, 0) 应为 200;普通 ArrayBuffer 或未隔离页面不能得到相同共享语义,应回退为消息传递。Atomics 解决并发读写的原子性,不负责取消已排队的业务任务。
Worker 错误、取消与回收
正常结果走 message,协议失败走 { type: 'error', requestId, message },脚本异常走 error 事件;调用 terminate() 后不应再收到结果。页面持有 Worker、监听器和 pending request,卸载时必须一起回收,否则旧页面可能继续提交状态。