Javascript WebSocket回调未使用angularjs激发
我需要一个全局应用程序智能网络套接字,它可以由我的所有控制器在应用程序中使用 下面的代码描述了我的用例,我正在创建一个工厂来共享一个单例websocket对象。提供的接口允许控制器通过套接字发送数据,并为传入消息连接侦听器 下面代码的问题是,我能够按预期在套接字上发送数据,但在数据通过套接字时无法接收数据 我读过一些与angular digest相关的解决方案,但它们并不适合我Javascript WebSocket回调未使用angularjs激发,javascript,angularjs,websocket,Javascript,Angularjs,Websocket,我需要一个全局应用程序智能网络套接字,它可以由我的所有控制器在应用程序中使用 下面的代码描述了我的用例,我正在创建一个工厂来共享一个单例websocket对象。提供的接口允许控制器通过套接字发送数据,并为传入消息连接侦听器 下面代码的问题是,我能够按预期在套接字上发送数据,但在数据通过套接字时无法接收数据 我读过一些与angular digest相关的解决方案,但它们并不适合我 angular .module('myApp', []) .factory('socket', functio
angular
.module('myApp', [])
.factory('socket', function() {
var socketStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'];
var socket = new WebSocket("ws://localhost:7070/ws");
socket.onopen = function(event) {
socket.send("hello");
};
socket.addEventListener('message', function(event) {
// I am able to see this so, it is confirmed that server is sending the data
console.log(event);
});
return {
emit: function (data) {
socket.send(JSON.stringify(data));
},
on: function(callback) {
socket.addEventListener('message', callback);
},
getStatus: function() {
var status = socket.readyState;
return socketStates[status]
}
};
})
.controller('MyController', function(socket){
var myctl = this;
//This works
socket.emit({type : "register", name: producer});
//This doesn't work
socket.on(function(event) {
console.log(event);
});
});
$rootScope.$apply(socket.addEventListener('message',callback))代码>
而不是
socket.addEventListener('message',回调)代码>
抛出以下错误
vendor.js:5错误:[$rootScope:inprog]$digest已在进行(…)(匿名函数)
摘要过程已在进行您必须检查$$phase
并用if语句包装您的代码:
if (!$scope.$$phase) {
$rootScope.$apply(socket.addEventListener('message', callback));
} else {
socket.addEventListener('message', callback);
}
有关更多检查:您的socket.on()
事件正在运行摘要周期,该周期与当前摘要周期冲突
您可以使用setTimeut()
来解决此问题
setTimeout(function(){
socket.on(function(event) {
console.log(event);
});
});
是否您的eventListener正在阅读“onmessage”?无法理解您的问题,是的,应在onmessage交换发出和套接字时启动eventListener。在
上并确保您的服务器正在发送任何数据我相信消息侦听器不存在?OnMead事件监听器是Socket文档中记录的文件吗?@ Oskar,我确信服务器正在发送数据,检查我编辑的代码。我们可以在工厂内部拥有<代码> $范围<代码>吗?理论上您可以,但我不建议,如果您在工厂中使用<代码> $ROOTSCORE 考虑重构您的代码。代码>$$phase
可能与$rootScope
一起工作,但它现在也在工作,不知道如何工作,因为我的代码将进入其他部分。还有一件事,为什么(!$scope.$$phase)
被认为是反模式的呢?@bruce_wayne我认为这很容易出错,因为它会创造竞争条件,并一个接一个地触发许多不必要的$apply
/$digest
阶段。更好的方法是什么?