Angular 延迟观测值

Angular 延迟观测值,angular,rxjs,deferred,observable,Angular,Rxjs,Deferred,Observable,我使用的是标准的WebSocket,它发送消息并最终接收响应。以前,我使用了$q.defer,存储了deferred对象并返回了一个承诺。响应处理程序将查找存储的延迟对象,并使用值解析它 这是否可能使用可观测数据 // As part of the websocket setup websocket.onmessage = function(message) { uuid = message.someResponse.uuid; this._observables[uuid].c

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

这是否可能使用可观测数据

// 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];
    }
);
//作为websocket设置的一部分
websocket.onmessage=函数(消息){
uuid=message.someResponse.uuid;
此.u可观察对象[uuid].create(函数(观察者){
onNext观察员(答复);
observer.onCompleted();
});
}
公共发送请求(请求:任意):可观察{
此.sendMessage(请求);
返回此值。_Observable[request[Object.keys(request)[0]].uuid]=new Observable();
}
//里面有一些请求方法
var observable=this.sendRequest(请求);
可观察的(
response=>console.log(响应),
response=>console.log(response.error),
() => {
删除此项。_回调[uuid];
}
);

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

public initialize() : Observable<any> {
  return Observable.create(observer => {
    websocket.onmessage = function(message) {
      uuid = message.someResponse.uuid;
      observer.next(message);
    }
  });
}
与承诺相反,可观察对象需要初始化一次,因为它们支持事件。每次发送消息时,事件回调(subscribe方法的第一个参数)将以消息作为参数调用

有关更多详细信息,请参阅“基于事件的支持”一节中的以下文章:


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

public initialize() : Observable<any> {
  return Observable.create(observer => {
    websocket.onmessage = function(message) {
      uuid = message.someResponse.uuid;
      observer.next(message);
    }
  });
}
与承诺相反,可观察对象需要初始化一次,因为它们支持事件。每次发送消息时,事件回调(subscribe方法的第一个参数)将以消息作为参数调用

有关更多详细信息,请参阅“基于事件的支持”一节中的以下文章:


不要改造轮子,RxJS已经支持WebSocket。不要改造轮子,RxJS已经支持WebSocket。