如何基于来自另一个可观察对象的内容生成可观察对象的内容

时间:2018-03-06 20:04:27

标签: angular rxjs observable angular-httpclient

我们有一个函数返回Observable<bool>来表示操作的成功或失败。

public operation(parameter: Parameter): Observable<boolean> {
    ... generate dataToSend with parameter values and other information  ...
    this._httpClient.post<AType>(this._url, dataToSend).subscribe(data => { this.processResult(data); });
}

函数processResult返回boolean,但我不知道如何将返回的值放在我想要从Observable<boolean> operation()中>

我想我必须创建一个新的Observable来返回它,但我不知道如何使用来自this.processResult(data)的数据执行observer.next。像这样:

public operation(parameter: Parameter): Observable<boolean> {
    ... generate dataToSend with parameter values and other information  ...
    this._httpClient.post<AType>(this._url, dataToSend).subscribe(data => { this.processResult(data); });
    return Observable.create(observer => observer.next('**the value coming from this.processResult(data)**'));
}

2 个答案:

答案 0 :(得分:2)

不要在这里进行订阅,而是使用map ... Map会将结果保存为可观察的。

return this._httpClient.post<AType>(this._url, dataToSend)
   .map(data => { return this.processResult(data) })

一定要把&#39;返回&#39;在你的http帖子出现之前

答案 1 :(得分:2)

如果你真的需要在operation(...)内订阅,你可以返回一个主题并订阅内部的Observable:

public operation(parameter: Parameter): Observable<boolean> {
  const subject = new Subject<boolean>();

  this._httpClient.post<AType>(this._url, dataToSend)
    .do(data => this.processResult(data))
    .mapTo(true)
    .subscribe(subject);

  return subject;
}

这样subject会正确传递所有nexterrorcomplete次通知。

请注意,我正在返回subject,但返回类型为Observable<boolean>。这是正确的,因为Subject类继承自Observable。这也可以防止我误用返回的subject因为TypeScript的打字警卫不允许我这样做(例如我无法在返回的Observable上调用next() )。