Javascript WebSocket回调未使用angularjs激发

Javascript WebSocket回调未使用angularjs激发,javascript,angularjs,websocket,Javascript,Angularjs,Websocket,我需要一个全局应用程序智能网络套接字,它可以由我的所有控制器在应用程序中使用 下面的代码描述了我的用例,我正在创建一个工厂来共享一个单例websocket对象。提供的接口允许控制器通过套接字发送数据,并为传入消息连接侦听器 下面代码的问题是,我能够按预期在套接字上发送数据,但在数据通过套接字时无法接收数据 我读过一些与angular digest相关的解决方案,但它们并不适合我 angular .module('myApp', []) .factory('socket', functio

我需要一个全局应用程序智能网络套接字,它可以由我的所有控制器在应用程序中使用

下面的代码描述了我的用例,我正在创建一个工厂来共享一个单例websocket对象。提供的接口允许控制器通过套接字发送数据,并为传入消息连接侦听器

下面代码的问题是,我能够按预期在套接字上发送数据,但在数据通过套接字时无法接收数据

我读过一些与angular digest相关的解决方案,但它们并不适合我

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
阶段。更好的方法是什么?