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

How to generate the content of an observable based on the content coming from another observable

我们有一个函数 returning 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 return 是一个 boolean 但我不知道如何将 returned 值放入我想要的 Observable<boolean>operation()

到 return

我想我必须创建一个新的 Observable 到 return 但我不知道如何使用来自 [=18= 的数据执行 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)**'));
}

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

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

请务必在您的 http post 生成之前添加 'return'

如果你真的需要在 operation(...) 内部订阅,你可以 return 一个 Subject 并将其自身订阅到内部 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 通知。

请注意,我 returning subject 但 return 类型是 Observable<boolean>。这是正确的,因为 Subject class 继承自 Observable。这也防止我滥用 returned subject 因为 TypeScript 的打字守卫不允许我这样做(例如我不能在 return 上调用 next() ed Observable).