我使用Autobahn.js进行Web套接字连接(我需要订阅套接字事件)。
我使用$ timeout来检查套接字事件。但我认为,这是错误的,不正确的不是最优的,我不想在控制器中使用$ timeout,也许承诺可以帮助我吗? 如何在没有$ timeout的情况下在控制器中捕获套接字消息?
app.factory('socket',['$rootScope',
function($rootScope) {
var pubsub = new ab.Session(
'wss://site.com/',
function(session) {
return session;
},
function(code, reason) {
}
);
return {
pubsub: pubsub
};
}]);
app.controller('mainCtrl', ['$timeout', 'socket', function($timeout, socket) {
$timeout(function() {
$scope.data = socket.pubsub.subscribe('3434424234324', function(topic, data) {
// do something if data.
// data contains socket message.
});
}, 300);
}]);
//3434424234324 - subscriber id

答案 0 :(得分:3)
WebSockets的一个基本思想是它们是异步的。你不必跟踪他们什么时候做事!如果最终使用$timeout
检查套接字是否收到了消息,那么可能出现了一些错误!可以$timeout
可以完全删除。
所有套接字接口都将公开处理程序回调函数,这些函数将负责处理套接字可以触发的不同事件。您需要做的是找到Autobahn的message
事件处理程序并在那里手动触发$scope
摘要。
Autobahn使用发布者/订阅者模型,这意味着您需要掌握subscribe
事件处理程序:
socket.pubsub.subscribe('3434424234324', function(topic, data) {
// do something if data.
// data contains socket message.
// let angular know something async has happened
$scope.$apply();
});
然而,我不建议改变所有代码以便这样做,而是建议将Autobahn包装到Angular工厂中,为您处理这种行为。更好的是,使用像angular-wamp这样已经完成此操作的库。
答案 1 :(得分:0)
我想出了一些快速的内容:
app.factory('socket',['$rootScope', function($rootScope) {
var connection = new autobahn.Connection({
url: 'url',
realm: 'realm'
});
var collection = {
'topic1': [],
'topic2': []
};
connection.onopen = function(session) {
session.subscribe('topic1').then(function(res){
collection.topic1.push(res);
});
};
connection.open();
return {
collection: collection
}
}]);
app.controller('mainCtrl', ['socket', function(socket) {
$scope.socket = socket;
}]);
然后在mainCtrl中,您可以访问主题数据,因为它们存储在集合中。如果你想在模板中显示它,你可以简单地使用{{socket.collection.topic1}},或ng-repeat等等。