簡體   English   中英

在第三方庫的回調中釋放余燼上下文

[英]Loosing ember context in callback of third party library

我的路線中有以下代碼用於接收模型的webocket更新。 問題是執行此行時

setTimeout(self.stompConnect, 10000);

我不再可以訪問stompConnect方法頂部的Ember.Route Ember對象。

var self = this; //no longer pointing to my route

我如何在這樣的第三個pary庫中的回調中維護余燼上下文? 這與websockets或庫無關,因為我與另一個具有回調的第三方庫存在相同的問題。

我想我需要使用.bind()之類的東西,但是我不知道正確的語法。

stompClient : null,

activate : function() {
    this.stompConnect();
},

stompConnect : function() {
    var self = this;

    var connectCallback = function(frame) {
        console.log('Connected: ' + frame);
        stompClient.subscribe('/topic/models/update', function(payload){
            var model = JSON.parse(JSON.parse(payload.body));
            var modelName = Object.keys(model)[0];
            var modelPayload = model[modelName];

            self.store.push(modelName, modelPayload);

        });
    };

    var errorCallback = function (error) {
        console.log('STOMP: ' + error);
        setTimeout(self.stompConnect, 10000); //when stompConnect() is called, the ember context is lost :(
        console.log('STOMP: Reconecting in 10 seconds');
    };

    var url = ... ;
    var socket = new SockJS(url);
    var stompClient = Stomp.over(socket);
    stompClient.connect({}, connectCallback, errorCallback);

    this.set('stompClient', stompClient);
},

deactivate : function() {
    this.get('stompClient').disconnect();
},

基本上,您在回調中有一個回調。 因此需要在兩個回調中傳遞上下文。 self將在errorCallBack中工作,但需要再次設置以在stompConnect工作。 我寧願建議使用run.latersetTimeOut 因此,代碼如下。

stompClient : null,

activate : function() {
    this.stompConnect();
},

stompConnect : function() {
    var self = this;

    var connectCallback = function(frame) {
        console.log('Connected: ' + frame);
        stompClient.subscribe('/topic/models/update', function(payload){
            var model = JSON.parse(JSON.parse(payload.body));
            var modelName = Object.keys(model)[0];
            var modelPayload = model[modelName];

            self.store.push(modelName, modelPayload);

        });
    };

    var errorCallback = function (error) {
        console.log('STOMP: ' + error);

        Ember.run.later(this, this.stompConnect, 1000);
        //or you can also use
        //setTimeout(this.stompConnect.bind(this), 10000); when stompConnect() is called, the ember context is lost :(
        console.log('STOMP: Reconecting in 10 seconds');
    };

    var url = ... ;
    var socket = new SockJS(url);
    var stompClient = Stomp.over(socket);
    stompClient.connect({}, connectCallback, errorCallback.bind(this));

    this.set('stompClient', stompClient);
},

deactivate : function() {
    this.get('stompClient').disconnect();
}

我更喜歡使用.bind()而不是var self = this; 但這要看情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM