1

Web ワーカー用の単純なラッパー クラスを作成しようとしています。定義されたメッセージの 1 つが webworker に送信されると、LayoutBridge はチケットを割り当てます。これは、リクエストが処理されたときに返されます。このようにして、これらのリクエストに対してコールバックを実行できるはずです。

次のエラーが表示されます

TypeError: this._waiting は未定義です

_recvMsg で。

ここにコードがあります。私はこの自作のなぞなぞを数日間解決しようとしていますが、LayoutBridge コンストラクターと (念のため) 両方で待機が定義されているため、何が間違っているのかわかりません。 init 関数で。

この直後にjsfiddleを投稿しますが、誰かがすでに答えを知っているかもしれません。

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];
};

編集、ここにフィドルがあります: 提案が含まれています: http://jsfiddle.net/MGSvj/2/

4

1 に答える 1

1

関数を別のクラスに割り当てると、そのスコープが変更されます。

ここでは、 this._recvMsg 関数を Worker クラスに割り当てています。

this._worker.onmessage = this._recvMsg;

したがって、ここのコードでは、これはウィンドウ オブジェクトまたはワーカー オブジェクトのいずれかになります (よくわかりませんが、間違いなく LayoutBridge オブジェクトにはなりません)。

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

これを修正するには、あなたがする必要があるのは

var oThis = this;
this._worker.onmessage = function (){ oThis._recvMsg };

また、https://developer.mozilla.org/en/docs/DOM/Blobに従って

Blob には、パラメーターとして配列が必要です。

だからあなたのコード

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

する必要があります

var blob = new Blob([$('#layout-worker').html()]);
于 2013-04-06T10:29:43.490 に答える