2016-10-15 3 views
0

サービスで実行する前に他の条件を確認するために、サービス内のサービスに対する "any"コールをリッスンできますか?AngularJS - リスナーサービス

私はこれを持っている:のSocketFactory以内

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

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

     return socket; 
}); 

は多くのそのようなemitような方法、connect、そしてより多くの、ならびにconnectedとしての特性です。私のコントローラで

は、私がsocket工場を注入し、のようなシンプルなものを行う:私は何をしたいか

socket.emit("test_message");

のいずれかの方法を実行する前に、単にsocketサービス内connectedプロパティをチェックしています。たとえば、サーバーがダウンした場合は、socket.connected=falseと私は接続を再初期化する必要があることを知りたいです。

私は手作業ですべてのメソッドをif(socket.connected) { ... }でサービスに入れることができましたが、socketFactoryのすべてのメソッドに対して単純に1つのブロックで行うことができるのだろうかと思っています。

私は本当に(動作しない)このような何かを探しています:

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