Tengo una pregunta sobre SignalR en el lado del cliente (JS). ¿Hay alguna forma de interceptar los mensajes entrantes en el lado del cliente? Estoy trabajando en una aplicación de chat con mucho tráfico en el socket. Quiero poder ejecutar código (capturar errores, si los hay) en cada evento entrante.
Mirando los documentos, no puedo encontrar ninguna solución existente para esto. ¿Hay uno?
Mi primer pensamiento para una solución alternativa fue usar una función para "canalizar" las funciones de devolución de llamada primero.
P.EJ
private pipeSignal(cb: (arg: any) => void): (arg: any) => void { const errors = checkForErrors(); if(errors){ return () => { // Handle error here }; } return cb; }Entonces pensé que configurar los controladores podría verse de la siguiente manera:
this.hubConnection.on( 'MyMethod1', this.pipeSignal((method1Val) => { console.log(method1Val); }) ); this.hubConnection.on( 'MyMethod2', this.pipeSignal((method2Val) => { console.log(method2Val); }) );PERO , esto da como resultado que la función 'pipeSignal' se llame solo una vez al configurar el detector de eventos. A partir de entonces, no se llamará.
Creo que la única opción aquí sería tener una función que verifique errores en cada devolución de llamada del detector de eventos.
private hasErrors(arg: any): boolean { const errors = checkForErrors(); if(errors){ // Handle error here return true; } return false; }Luego, en cada devolución de llamada de evento de señal, puede intentar verificar errores como este:
this.hubConnection.on( 'MyMethod1', (method1Val) => { if(!this.hasErrors(method1Val)){ // Can continue knowing there are no errors console.log(method1Val); } } );Resulta que estaba cerca de mi función 'pipeSignal'. En lugar de ejecutar la lógica de error en la función pipeSignal, devuelvo una función que envuelve la lógica de error y la devolución de llamada:
private pipeSignal(cb: (arg: any) => void): (arg: any) => void { return (arg) => { const errors = checkForErrors(); if(errors){ // handle errors } else { // proceed with callback as there are no errors cb(arg); } }; }Ahora esto se puede usar como imaginé antes:
this.hubConnection.on( 'MyMethod1', this.pipeSignal((method1Val) => { console.log(method1Val); }) );