AngularJS - 服务中的监听器

时间:2016-10-15 14:33:17

标签: angularjs socket.io angular-services

你能听到"任何"调用服务本身内的服务,以便在执行服务之前验证其他一些条件?

我有这个:

.factory('socket',function('socketFactory') {

      var socket = io.connect(nodeUrl, {
        query: my_query
      });

      return socket;
});

在socketFactory中有许多方法,例如emitconnect等,以及connected等属性。

在我的控制器中,我注入socket工厂并执行简单的操作:

socket.emit("test_message");

我想要做的是在执行任何方法之前,只需在connected服务中检查socket属性。例如,如果服务器出现故障,那么socket.connected=false,我想知道我需要重新初始化连接。

我可以用if(socket.connected) { ... }手动将所有方法放在服务中,但我想知道是否可以使用socketFactory中的所有方法只使用一个块来完成。

我真的在寻找这样的东西(不起作用):

  socket.on(event, function(){
    console.log("You tried:" + event);
  });

1 个答案:

答案 0 :(得分:0)

由于OP中有两个问题,我将回答第一个问题:

.factory('socket',function('socketFactory') {
  var socket = {};
  socket._socket = { connected: false };
  socket.initialize = function() {
    this._socket = io.connect(nodeUrl, {
      query: my_query
    });
  };
  socket.initialize();
  // find all available functions on socket._socket
  var fns = Object.keys(socket._socket).filter(function (x) {
    return typeof socket._socket[x] == 'function';
  });
  // create a one-to-one mapping of functions on socket from the
  // member _socket such that we check the socket connection state
  // before calling the underlying _socket function with the same 
  // name
  angular.forEach(fns, function (x) {
    socket[x] = function () {
      if (!this._socket.connected) {
        this.initialize();
      } 
      if (this._socket.connected) {
        this._socket[x].apply(this._socket, [].slice.call(arguments));
      }
    }
  });

  return socket;
});