等待一个可观察对象完成

8
我有一个需要等待observable完成的方法。我知道observable非常适合随着时间返回单个数据,但我需要知道这个observable何时完全完成返回其所有数据,以便在返回的对象上运行验证代码。
getCustom方法订阅在提供的url上运行的observable,然后返回observable。
我不太确定这是否是处理此情况的最佳方法,因此如果有人能给我任何建议或处理此问题的方向,我将不胜感激。
  private validateQuoteRetrievalAnswers(reference: string) {

         // Get the risk from the server
        this.riskManager.getRiskFromServer(reference);

        if (this.riskManager.risk) {
            // Validate risk that was returned
        }
    }

getRiskFromServer(quoteReference: string) {

    this.riskService.getCustom("Url").subscribe => {
        // need to know when the observable has returned the risk
    });

}

3
你不能等待可观察对象完成。你只能订阅并在subscribe(...)中传递回调函数,在数据到达时调用该回调函数。 - Günter Zöchbauer
这两种方法都在不同的服务中,你能否举个例子说明你的意思? - user4129529
3
那么在服务中不要调用subscribe()(只需返回可观察的对象return this.riskService.getCustom("Url");),并在需要数据的服务中使用getRiskFromServer(...).subscribe(...)。参见https://dev59.com/9FoV5IYBdhLWcg3wauOP#36291681。 - Günter Zöchbauer
1个回答

8
我将如何解决这个问题:
查询您的后端,当我们获得所需内容时,将其推送到一个Subject。
riskSubject = new Subject<Risk>();

getRiskFromServer(quoteReference: string) {
  this.riskService.getCustom("Url")
  .subscribe( 
    data => { this.riskSubject.next(data); },
    error => { console.log(error) }
 });
}

然后订阅主题并等待获取所需内容,开始验证。
private validateQuoteRetrievalAnswers(reference: string) {

         // Get the risk from the server
        this.riskManager.getRiskFromServer(reference);
        // subscribe to subject
        this.riskManager.riskSubject.subscribe(
         data => {
           //do your validation
        })
}

观察数据服务的核心是RxJs主题。主题实现观察者和可观察接口,这意味着我们可以使用它们来发出值并注册订阅者。主题只是传统事件总线,但更强大,因为它提供了所有RxJs功能运算符。但在其核心,我们只需像常规可观察对象一样使用它进行订阅。来源:angular-university.io。或者,您可以使用Observable.fromPromise(promise),但如果您是ng2的新手,则会使事情变得更加复杂。

这正是我最终所做的,我的问题在于我试图在riskSubject.subscribe()的成功处理程序之后执行特定的逻辑。相反,我只是在data = {}代码块内执行了我的操作。更多的是我的错误在于没有理解如何最好地利用可观察对象的可用性。 - user4129529

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接