RxJS combineAll 运算符,解释
RxJS combineAll Operator, explanation
我想了解 combineAll
运算符是如何工作的。
我正在使用 official documentation 中的以下示例:
import { take, map, combineAll } from 'rxjs/operators';
import { interval } from 'rxjs';
const source$ = interval(1000).pipe(take(2));
const example$ = source$.pipe(
map(val =>
interval(1000).pipe(
map(i => `Result (${val}): ${i}`),
take(5)
)
)
);
example$
.pipe(combineAll())
.subscribe(console.log);
然后输出是:
["Result (0): 0", "Result (1): 0"]
["Result (0): 1", "Result (1): 0"]
["Result (0): 1", "Result (1): 1"]
["Result (0): 2", "Result (1): 1"]
["Result (0): 2", "Result (1): 2"]
["Result (0): 3", "Result (1): 2"]
["Result (0): 3", "Result (1): 3"]
["Result (0): 4", "Result (1): 3"]
["Result (0): 4", "Result (1): 4"]
为了找出原因,我做了这个简单的方案:
我从文档中了解到,每次任何内部 Observable 发出一个值时,这个发出的值都会与所有其他内部 Observable 的最后一个值相结合。
在上面的方案中,我们可以看到内部 Observables 在一段时间内发出了 10 个值,所以我期望在一段时间内得到一个具有 10 个值的输出,但它是 9。
此外,在输出的第一行:
["Result (0): 0", "Result (1): 0"])
'Result (1): 0'的0是否对应空值?因为 Observable 'inner 2' 还没有发射任何东西?
到此结束是我所期望的输出:
["Result (0): 0", "Result (1): 0"]
["Result (0): 1", "Result (1): 0"]
["Result (0): 1", "Result (1): 0"]
["Result (0): 2", "Result (1): 0"]
["Result (0): 2", "Result (1): 1"]
["Result (0): 3", "Result (1): 1"]
["Result (0): 3", "Result (1): 2"]
["Result (0): 4", "Result (1): 2"]
["Result (0): 4", "Result (1): 3"]
["Result (0): 4", "Result (1): 4"]
明显是错误的,但是我没有发现我的错误,谁能解释一下?
考虑 combineAll
:
flattens an Observable-of-Observables by applying combineLatest
when the Observable-of-Observables completes.
还有那个 combineLatest
;
will actually wait for all input Observables to emit at least once.
因此,combineAll
可观察对象的第一个发射包含 "Inner 1" 可观察对象的第一个值不会发生,直到 "Inner 2" 可观察对象发出其第一个值。所以只有九次排放 - 而不是十次。
我想了解 combineAll
运算符是如何工作的。
我正在使用 official documentation 中的以下示例:
import { take, map, combineAll } from 'rxjs/operators';
import { interval } from 'rxjs';
const source$ = interval(1000).pipe(take(2));
const example$ = source$.pipe(
map(val =>
interval(1000).pipe(
map(i => `Result (${val}): ${i}`),
take(5)
)
)
);
example$
.pipe(combineAll())
.subscribe(console.log);
然后输出是:
["Result (0): 0", "Result (1): 0"]
["Result (0): 1", "Result (1): 0"]
["Result (0): 1", "Result (1): 1"]
["Result (0): 2", "Result (1): 1"]
["Result (0): 2", "Result (1): 2"]
["Result (0): 3", "Result (1): 2"]
["Result (0): 3", "Result (1): 3"]
["Result (0): 4", "Result (1): 3"]
["Result (0): 4", "Result (1): 4"]
为了找出原因,我做了这个简单的方案:
我从文档中了解到,每次任何内部 Observable 发出一个值时,这个发出的值都会与所有其他内部 Observable 的最后一个值相结合。
在上面的方案中,我们可以看到内部 Observables 在一段时间内发出了 10 个值,所以我期望在一段时间内得到一个具有 10 个值的输出,但它是 9。
此外,在输出的第一行:
["Result (0): 0", "Result (1): 0"])
'Result (1): 0'的0是否对应空值?因为 Observable 'inner 2' 还没有发射任何东西?
到此结束是我所期望的输出:
["Result (0): 0", "Result (1): 0"]
["Result (0): 1", "Result (1): 0"]
["Result (0): 1", "Result (1): 0"]
["Result (0): 2", "Result (1): 0"]
["Result (0): 2", "Result (1): 1"]
["Result (0): 3", "Result (1): 1"]
["Result (0): 3", "Result (1): 2"]
["Result (0): 4", "Result (1): 2"]
["Result (0): 4", "Result (1): 3"]
["Result (0): 4", "Result (1): 4"]
明显是错误的,但是我没有发现我的错误,谁能解释一下?
考虑 combineAll
:
flattens an Observable-of-Observables by applying
combineLatest
when the Observable-of-Observables completes.
还有那个 combineLatest
;
will actually wait for all input Observables to emit at least once.
因此,combineAll
可观察对象的第一个发射包含 "Inner 1" 可观察对象的第一个值不会发生,直到 "Inner 2" 可观察对象发出其第一个值。所以只有九次排放 - 而不是十次。