Ember.js 在第三方库回调中释放余烬上下文

Ember.js 在第三方库回调中释放余烬上下文,ember.js,Ember.js,我的路线中有以下代码,用于接收模型的webocket更新。问题是当这行执行时 setTimeout(self.stompConnect, 10000); 我不再有权访问stompConnect方法顶部的Ember.Route Ember对象 var self = this; //no longer pointing to my route 如何在第三方库中跨回调维护余烬上下文?这与WebSocket或库无关,因为我与另一个具有回调的第三方库有相同的问题 我想我需要使用.bind()或其他东西

我的路线中有以下代码,用于接收模型的webocket更新。问题是当这行执行时

setTimeout(self.stompConnect, 10000);
我不再有权访问stompConnect方法顶部的Ember.Route Ember对象

var self = this; //no longer pointing to my route
如何在第三方库中跨回调维护余烬上下文?这与WebSocket或库无关,因为我与另一个具有回调的第三方库有相同的问题

我想我需要使用.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.later
setTimeOut
。这就是代码

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。但这要视情况而定