Angular 7 RXjs 6.x - 如何使用 forkJoin(`of` 和 `Observable.create` 的区别)
Angular 7 RXjs 6.x - How to use forkJoin (difference between `of` and `Observable.create`)
我的 console.log 从未被调用(我的 2 个请求被调用并且正常)。
const obs1 = this.awsService.getUsers();
const obs2 = this.apiService.get('admin/user');
return forkJoin(obs1, obs2).subscribe((res) => {
console.log('res2', res);
});
我尝试单元调用(console.log A 和 B 没问题):
const obs1 = this.awsService.getUsers();
obs1.subscribe((res) => {
console.log('A' + res);
});
const obs2 = this.apiService.get('admin/user');
obs2.subscribe((res) => {
console.log('B' + res);
});
编辑
我的代码return 一个 User[] 的可观察对象,但是 KO 一个 forkJoin:
getUsers(): Observable<User[]> {
return Observable.create(obs => {
const u = new User;
u.username = user.Username;
_users.push(u);
return obs.next(_users);
});
}
这段代码可以:
const u1: User = new User;
u1.username = 'foo';
const u2: User = new User;
u2.username = 'foo';
const o2: Observable<User[]> = of([u1, u2]);
const fj = forkJoin(o2);
fj.subscribe(res => {
console.log('r');
});
// r is ok in console
of
和Observable.create( ... return obs.next(_users);)
有什么区别?
create 和 of 的区别在于,根据定义,of 在发出一项后完成。除非您指定,否则创建不会完成。
如果你这样做了:
getUsers(): Observable<User[]> {
return Observable.create(obs => {
const u = new User;
u.username = user.Username;
_users.push(u);
obs.next(_users);
obs.complete();
return () => {}; // return value should be clean up function on completion if needed
});
}
然后它会起作用,因为你在发射后立即完成。 forkJoin 期望所有流都完成并且不会发出直到所有流都完成,并且它只会发出流中的最新值。
如果您真的想要所有发射,请考虑使用 combineLatest
我的 console.log 从未被调用(我的 2 个请求被调用并且正常)。
const obs1 = this.awsService.getUsers();
const obs2 = this.apiService.get('admin/user');
return forkJoin(obs1, obs2).subscribe((res) => {
console.log('res2', res);
});
我尝试单元调用(console.log A 和 B 没问题):
const obs1 = this.awsService.getUsers();
obs1.subscribe((res) => {
console.log('A' + res);
});
const obs2 = this.apiService.get('admin/user');
obs2.subscribe((res) => {
console.log('B' + res);
});
编辑
我的代码return 一个 User[] 的可观察对象,但是 KO 一个 forkJoin:
getUsers(): Observable<User[]> {
return Observable.create(obs => {
const u = new User;
u.username = user.Username;
_users.push(u);
return obs.next(_users);
});
}
这段代码可以:
const u1: User = new User;
u1.username = 'foo';
const u2: User = new User;
u2.username = 'foo';
const o2: Observable<User[]> = of([u1, u2]);
const fj = forkJoin(o2);
fj.subscribe(res => {
console.log('r');
});
// r is ok in console
of
和Observable.create( ... return obs.next(_users);)
有什么区别?
create 和 of 的区别在于,根据定义,of 在发出一项后完成。除非您指定,否则创建不会完成。
如果你这样做了:
getUsers(): Observable<User[]> {
return Observable.create(obs => {
const u = new User;
u.username = user.Username;
_users.push(u);
obs.next(_users);
obs.complete();
return () => {}; // return value should be clean up function on completion if needed
});
}
然后它会起作用,因为你在发射后立即完成。 forkJoin 期望所有流都完成并且不会发出直到所有流都完成,并且它只会发出流中的最新值。
如果您真的想要所有发射,请考虑使用 combineLatest