Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 这是未定义的_Javascript_Web Worker - Fatal编程技术网

Javascript 这是未定义的

Javascript 这是未定义的,javascript,web-worker,Javascript,Web Worker,我正在尝试为web工作者编写一个简单的包装器类。当其中一条已定义的消息被发送到webworker时,LayoutBridge将分配一个票证,该票证在处理请求时返回。这样,我应该能够为这些请求运行回调 我得到以下错误 TypeError:此.\u等待未定义 在_recvMsg中 这是代码,我已经尝试解决这个自创的谜题好几天了,但我看不出我做错了什么,因为等待在LayoutBridge构造函数和(为了确保)init函数中都有定义 在这之后,我将立即发布一个JSFIDLE,但可能有人已经知道答案了 v

我正在尝试为web工作者编写一个简单的包装器类。当其中一条已定义的消息被发送到webworker时,LayoutBridge将分配一个票证,该票证在处理请求时返回。这样,我应该能够为这些请求运行回调

我得到以下错误

TypeError:此.\u等待未定义

在_recvMsg中

这是代码,我已经尝试解决这个自创的谜题好几天了,但我看不出我做错了什么,因为等待在LayoutBridge构造函数和(为了确保)init函数中都有定义

在这之后,我将立即发布一个JSFIDLE,但可能有人已经知道答案了

var LayoutBridge = function(){

    this._waiting = {};
    this._initialized = false;

};

LayoutBridge.prototype.init = function(opts){
    if(!this._initialized){
        this._waiting = {};

        this._worker = new Worker('/layout-worker.js');
        this._worker.onmessage = this._recvMsg;
        var ticket = _.uniqueId();

        var waitingCallback = function(){
            this._initiated = true;
        };
        waitingCallback.bind(this);
        this._waiting[ticket] = waitingCallback;

        this._worker.postMessage({cmd: 'init', ticket: ticket});
        this._initialized = true;
    }
};

LayoutBridge.prototype.addVertex = function(callback){
    if(!this._initialized) throw "Initialize LayoutBridge first";

    var ticket = _.uniqueId();
    this._waiting[ticket] = callback;
    this._worker.postMessage({cmd: 'addVertex', ticket: ticket});
};

LayoutBridge.prototype.removeVertex = function(id, callback){
    if(!this._initialized) throw "Initialize LayoutBridge first";

    var ticket = _.uniqueId();
    this._waiting[ticket] = callback;
    this._worker.postMessage({cmd: 'removeVertex', id: id, ticket: ticket});
};

LayoutBridge.prototype.addEdge = function(sourceId, targetId, callback){
    if(!this._initialized) throw "Initialize LayoutBridge first";

    var ticket = _.uniqueId();
    this._waiting[ticket] = callback;
    this._worker.postMessage({cmd: 'addEdge', sourceId: sourceId, targetId: targetId});
};

LayoutBridge.prototype._recvMsg = function(e){
    this._waiting[e.data.ticket](e.data.payload);
    //delete this._waiting[e.data.ticket];
};

编辑,这里是小提琴:包括的建议:

将函数分配给另一个类会更改其范围

在这里,您将把this.\u recvMsg函数分配给Worker类

this._worker.onmessage = this._recvMsg;
因此,在这里的代码中,这将是window对象或worker对象(不太确定,但肯定不会是LayoutBridge对象)

要解决这个问题,你需要做的就是

var oThis = this;
this._worker.onmessage = function (){ oThis._recvMsg };
此外,根据

Blob需要一个数组作为参数

所以你的代码

var blob = new Blob($('#layout-worker').html());
应该是

var blob = new Blob([$('#layout-worker').html()]);

将函数分配给另一个类会更改其范围

在这里,您将把this.\u recvMsg函数分配给Worker类

this._worker.onmessage = this._recvMsg;
因此,在这里的代码中,这将是window对象或worker对象(不太确定,但肯定不会是LayoutBridge对象)

要解决这个问题,你需要做的就是

var oThis = this;
this._worker.onmessage = function (){ oThis._recvMsg };
此外,根据

Blob需要一个数组作为参数

所以你的代码

var blob = new Blob($('#layout-worker').html());
应该是

var blob = new Blob([$('#layout-worker').html()]);

谢谢,这样就消除了错误。您对调试web Worker有什么一般建议吗?(我知道这个特定的错误不会被我所能做的太多捕捉到)也许你有一些智慧的话……chrome提供了一个很好的调试工具。只需输入'debugger;'在得到错误的代码中。运行代码时,保持chrome控制台打开(按F12)。你的代码会停在那里,你可以很容易地一步一步地找出出错的地方。好吧,它消除了错误,但是回调仍然没有被调用。我使用了
var oThis=this;this._worker.onmessage=函数(e){oThis._recvMsg(e);}这是一个下划线.js函数。对不起,遗漏了。将为子孙后代进行编辑,从而消除错误。您对调试web Worker有什么一般建议吗?(我知道这个特定的错误不会被我所能做的太多捕捉到)也许你有一些智慧的话……chrome提供了一个很好的调试工具。只需输入'debugger;'在得到错误的代码中。运行代码时,保持chrome控制台打开(按F12)。你的代码会停在那里,你可以很容易地一步一步地找出出错的地方。好吧,它消除了错误,但是回调仍然没有被调用。我使用了
var oThis=this;this._worker.onmessage=函数(e){oThis._recvMsg(e);}这是一个下划线.js函数。对不起,遗漏了。将为后代编辑