You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Web Worker onmessage访问类变量报错的解决方法

问题解决:Worker回调中无法访问Queue实例的this.size

错误原因

在myWorker.onmessage的传统function回调里,this的指向并非Queue类的实例,而是指向Worker对象本身,所以访问this.size时会得到undefined,进而触发报错。

三种解决方法

方法1:使用箭头函数

箭头函数不会绑定独立的this,会继承外层作用域的this(也就是Queue实例):

sendChunk(chunkId) {
    if (window.Worker) {
        const myWorker = new Worker("/worker.js");
        myWorker.postMessage([chunkId]);
        // 改用箭头函数
        myWorker.onmessage = (e) => {
            console.log(e.data);
            console.log(this.size); // 现在能正确访问Queue实例的size
        }
    }
}

方法2:提前保存实例的this到变量

在回调外把Queue实例的this存到变量(比如that),回调里用这个变量访问:

sendChunk(chunkId) {
    if (window.Worker) {
        const myWorker = new Worker("/worker.js");
        const that = this; // 保存实例的this
        myWorker.postMessage([chunkId]);
        myWorker.onmessage = function(e) {
            console.log(e.data);
            console.log(that.size); // 用that访问实例的size
        }
    }
}

方法3:用bind绑定this

通过bind方法把回调的this强制绑定到Queue实例:

sendChunk(chunkId) {
    if (window.Worker) {
        const myWorker = new Worker("/worker.js");
        myWorker.postMessage([chunkId]);
        myWorker.onmessage = function(e) {
            console.log(e.data);
            console.log(this.size);
        }.bind(this); // 绑定this到Queue实例
    }
}

额外提示

你的main.js里调用了q.startQueue(),但Queue类中并没有定义startQueue方法,这会导致新的报错,需要补充实现这个方法或者修改调用逻辑。

内容的提问来源于stack exchange,提问作者binggle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 08:56:06