Ember.js 在第三方库回调中释放余烬上下文
我的路线中有以下代码,用于接收模型的webocket更新。问题是当这行执行时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()或其他东西
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代码>。但这要视情况而定