为什么要将观察者与rxjs一起使用?

时间:2018-02-03 16:56:47

标签: javascript typescript websocket observers reactivex

我目前正在开发一款小型应用程序,它基本上可以复制whatsapp的功能,可以进行简单的聊天。

为此,我使用了websockets,我偶然发现了几个教程和stackoverflow帖子,这些帖子使用了websocket的这种代码,然后我将其用于我的项目。



private create(url) {
    const websocket = new WebSocket(url);
    const observable: Observable<MessageEvent> = Observable.create(
      (observerInLambda: Observer<MessageEvent>) => {
        websocket.onmessage = observerInLambda.next.bind(observerInLambda);
        websocket.onerror = observerInLambda.error.bind(observerInLambda);
        websocket.onclose = observerInLambda.complete.bind(observerInLambda);
        return websocket.close.bind(websocket); // When unsubbing from the observable the websocket is closed
      }
    );
    const observer = {
      next: (data: Object) => {
        if (websocket.readyState === WebSocket.OPEN) {
          websocket.send(JSON.stringify(data));
        }
      },
      error: (err: any) => {
        console.log(err);
      },
      complete: () => {
        console.log("complete");
      }
    };

    return Subject.create(observer, observable);
}
&#13;
&#13;
&#13;

这个工作大部分都很好,从取消订阅时断开连接,但这不是我的问题。我知道我必须使用某种回调/事件样式代码,如websocket.onmessage = (data:Object) => doStuff(data);来读取websocket,但令我困惑的是为什么我必须使用一个观察者,我调用了.next函数,然后调用websocket.send。为什么不简单地调用websocket.send,而不是异步函数......

对我来说,似乎整个模式包括主题对我正在做的事情有点矫枉过正?我得错了什么,或者在我的情况下根本没用?

0 个答案:

没有答案