【问题标题】:rjxjs handle network errors from socket.io-clientrjxjs 处理来自 socket.io-client 的网络错误
【发布时间】:2020-05-04 11:32:26
【问题描述】:

我使用 rxjs 和 socket.io 客户端。 我想解决这个问题。

  1. 套接字已连接
  2. 用户发送数据
  3. 套接字在传递过程中出现任何网络错误
  4. 发货失败
  5. socket 向用户抛出错误

这是我的代码。 Observable 内的网络错误如何处理?

   private sendData(data: any, event: SOCKET_EVENTS): Observable<any> {   
    return new Observable<any>(observer => {
      this.socket
        .emit(event, data, function(responseData: Result<any>) {
          console.log("Data sended", responseData);
          if (responseData.success === true) {
            observer.next(responseData.data);
            observer.complete();
          } else {
            console.error(" this.socketData not sended", responseData);
            observer.error(data);
          }
        })
     });
  }

【问题讨论】:

    标签: socket.io rxjs ngrx


    【解决方案1】:

    您可以使用事件error 或其他方式在全局范围内处理错误。对于每一个发射,你可以使用acknowledgements。无论如何,处理错误的过程应该更复杂。例如:

    private sendData(data: any, event: SOCKET_EVENTS): Observable<any> {   
    return new Observable<any>(observer => {
      // set timeout before call error
      let errorTimeout = setTimeout(() => {
          console.error(" this.socketData not sended");
          observer.error();
      }, 5000);
    
      this.socket
        .emit(event, data, (responseData: Result<any>) => {
          console.log("Data sended", responseData);
            observer.next(responseData.data);
            observer.complete();
    
            // reset timer
            clearTimeout(errorTimeout);
        })
     });
    

    }

    我们等待 5 秒以确认响应。您还应该添加逻辑来处理全局错误。

    【讨论】:

    • 关于这个解决方案你能说什么:1)在发送检查套接字状态之前,如果断开连接 throwError 2)添加一次('disconnected')到 socket.emit()。代码在这里pastebin.com/kvkkMgmV
    猜你喜欢
    • 2016-12-16
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 2018-05-11
    • 2011-08-17
    • 2013-05-11
    相关资源
    最近更新 更多