2017-04-15 52 views
2

我在Angular中构建了一个警戒器,我需要发出两个不同的HTTP请求,并基于这两个请求确定是否继续。我注意到forkJoin是这样做的正确方法,但我无法让我的火。无法获得forkJoin发射

在我的代码,我有:

this.userService.watchCurrentUser().subscribe(data => { console.log(data) }); 
this.orgService.watchOrg().subscribe(data => { console.log(data) }); 
Observable.forkJoin(
    this.userService.watchCurrentUser(), 
    this.orgService.watchOrg() 
).subscribe(data => { 
    console.log(data); 
}); 

前两个订阅后来加入到测试,如果调用实际上开火,他们是;我看到他们的日志。但我从来没有看到很多从forkJoin

我导入我的文件的顶部:

import { Observable, BehaviorSubject } from 'rxjs/Rx'; 
import 'rxjs/add/observable/forkJoin'; 

是否有别的我失去了一些东西,以便使用forkJoin

回答

3

Observable.forkJoin()要求所有源Observable发出至少一个项目并完成。

您确定您的源代码Observables已完成吗?

如果他们不(并根据​​他们的内部逻辑他们不能)也许你宁愿使用zip()combineLatest()

+0

他们都做火;我怀疑这可能是问题所在,这就是为什么我将订阅添加到顶端,并且我看到它们实际上都会发出2个值(我在其他地方也会调用它们)。我最终看到4个日志(顶部的2个),但没有一个来自forkJoin本身。这两个调用都只是HTTP请求的包装,所以除了我所知,禁止返回所需的时间都应该发出。 – RhoVisions

+0

当我无法自己测试时,我不知道你的代码应该做什么,但是如果你确定它们都发出并且你知道你总是只想要一个项目,你可以用'take(1)'链接它们来完成收到第一个值后。 – martin

+0

我面临的问题是我需要两个HTTP请求来完成,因为我需要从两个数据来确定如何继续。有更多数据可以帮助我们解决问题吗?正如我所提到的,它们实际上只是HTTP调用的包装器,内置了一些缓存。 – RhoVisions

0

在你的情况下,一个警卫,你只需要每个流的一个结果。 因此,应将本:

Observable.forkJoin(
    this.userService.watchCurrentUser().first(), 
    this.orgService.watchOrg().first() 
).map(data => { 
    let permitted: boolean; 
    // check the data you want to. 
    return permitted; 
}); 

在叉上方的代码组合两个可观察的第一结果,并且两个结果将被映射到一个布尔值。