我试图在两个Observable上使用forkJoin
。其中一个以流形式开始...如果我直接订阅它们,我会得到一个回复,private data$: Observable<any[]>;
private statuses$: Observable<any[]>;
private queryStream = new Subject<string>();
....
this.data$ = this.queryStream
.startWith('')
.flatMap(queryInput => {
this.query = queryInput
return this._companyService.getCompanies(this.queryRequired + ' ' + this.query, this.page, this.sort);
})
.share();
...
Observable.forkJoin(this.statuses$, this.companies$)
.subscribe(res => {
console.log('forkjoin');
this._countStatus(res[0], res[1]);
});
// This shows arrays in the console...
this.statuses$.subscribe(res => console.log(res));
this.companies$.subscribe(res => console.log(res));
// In the console
Array[9]
Array[6]
不会被解雇。有任何想法吗?
upstream myapp {
server 192.168.0.21:8080;
server 192.168.0.22:8080;
server 192.168.0.23:8080;
}
server {
listen 80;
server_name localhost;
location /foo/bar/blah/ {
rewrite ^/foo/blah^/ /$1 break;
proxy_pass http://myapp;
}
答案 0 :(得分:4)
forkJoin
的一个非常常见的问题是它要求所有源Observable发出至少一个项目,并且所有项目都必须完成。
换句话说,如果this.statuses$
或this.companies$
没有发出任何项目,并且在完成forkJoin
之前不会发出任何内容。
this.statuses$.subscribe(
res => console.log(res),
undefined,
() => console.log('completed'),
);
答案 1 :(得分:1)
forkJoin
仅在所有内部可观测值都完成时发射。
如果您需要等效的forkJoin
来监听每个来源的单个发射,请使用combineLatest
+ take(1)
combineLatest(
this.statuses$,
this.companies$,
)
.pipe(
take(1),
)
.subscribe(([statuses, companies]) => {
console.log('forkjoin');
this._countStatus(statuses, companies);
});
两个源均发出信号后,combineLatest
将发出信号,take(1)
将在此之后立即退订。
答案 2 :(得分:0)
Observable.forkJoin([
_someService.getUsers(),
_someService.getCustomers(),
])
.subscribe((data: [Array<User>, Array<Customer>]) => {
let users: Array<User> = data[0];
let customer: Array<Customer> = data[1];
}, err => {
});
//someService
getUsers():Observable<User> {
let url = '/users';
return this._http.get(url, headers)
.map(res => res.json());
}
getCustomers():Observable<Customer> {
let url = '/customers';
return this._http.get(url, headers)
.map(res => res.json());
}
答案 3 :(得分:0)
this.statuses$.pipe(mergeMap(source => this.companies$.pipe(map(inner => [source , inner])))).subscribe(([e , r]) => {
console.log(e , r);
})
forkJoin无法正常工作,因此我使用了上面的代码来解决我的问题。使用mergeMap,您可以将外部订阅的结果映射到内部订阅,然后根据需要订阅
答案 4 :(得分:0)
对我来说,combineLatest
运算符就是解决方案!