2016-10-15 29 views
0

为了在执行服务之前验证一些其他条件,您是否可以监听服务内部对服务的“任何”调用?AngularJS - 正在服务的听众

我有这样的:

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

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

     return socket; 
}); 

内的SocketFactory很多方法,如emitconnect等等,以及性能,如connected

在我的控制器,我注入了socket工厂和做简单的东西,如:

socket.emit("test_message");

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

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

我真的期待这样的事情(不工作):

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

回答

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; 
});