推迟观察

时间:2016-03-29 12:10:06

标签: angular rxjs deferred observable

我使用标准的WebSocket发送消息并最终收到响应。以前,我使用了$q.defer,存储了延迟对象并返回了一个promise。响应处理程序将查找存储的延迟对象并使用值解析它。

这是否可以使用observables?

// As part of the websocket setup
websocket.onmessage = function(message) {
    uuid = message.someResponse.uuid;
    this._observables[uuid].create(function(observer) {
        observer.onNext(response);
        observer.onCompleted();
    });
}

public sendRequest(request : any) : Observable<any> {
    this.sendMessage(request);
    return this._observables[request[Object.keys(request)[0]].uuid] = new Observable();
}

// Inside some requesting method
var observable = this.sendRequest(request);
observable.subscribe(
    response => console.log(response),
    response => console.log(response.error),
    () => {
        delete this._callbacks[uuid];
    }
);

1 个答案:

答案 0 :(得分:2)

我会以这种方式重构您的代码:

public initialize() : Observable<any> {
  return Observable.create(observer => {
    websocket.onmessage = function(message) {
      uuid = message.someResponse.uuid;
      observer.next(message);
    }
  });
}

以及发送和接收消息的方式:

var observable = initialize();

var request = (...)
this.sendRequest(request);

observable.subscribe(
  message => {
    // called each time a message is received
    console.log(message)
  },
  response => {
    console.log(response.error)
  },
  () => {
  }
);

与承诺相反,可观察者需要初始化一次,因为它们支持事件。每次发送消息时,将使用消息作为参数调用事件回调(subscribe方法的第一个参数)。

有关详细信息,您可以查看以下文章&#34;基于事件的支持&#34;: