0%

rxjs 操作符 combineLatest

combineLatest是组合操作符,用来组合多个Observables来创建一个Observable,该Observable的值根据每个输入Observable的最新值进行计算。

来看看语法表达式:

1
public static combineLatest(observable1: ObservableInput, observable2: ObservableInput, project: function, scheduler: Scheduler): Observable

参数:

  • observable1 用来和其他observable结合的输入observable
  • observable2 用来和其他observable结合的输入observable
  • project 可选,投射成输出Observable上的一个新值
  • scheduler 可选,默认值为null,用来订阅每个输入Observable的调度器。

combineLatest结合所有输入的Observable参数的值,顺序订阅每个Observable。每当任一输入的Observable发出新的值时,收集每个输入Observable的最新值组成一个数组。所以,当给操作符输入n个Observable时,返回的Observable总是会发出一个长度为n的数组,对应输入的Observable的顺序(第一个Observable的值为数组第一个)。

为了保证输出数组的长度相同,在返回的Observable发出值之前,combineLatest实际上会等待所有的输入Observable至少发出一次。

这意味着,如果某个输入的Observable在其余的Observable发出值之前发出了多个值,那么它发出的值只保留最新的。

另一方面,如果某个输入的Observable没有发出值就完成了,返回的Observalbe也不会发出值并立马完成。因为不可能从已完成的Observalbe中收集到值。

同样,如果某个输入的Observable不发出值也不完成,那么combineLatest也永远不会发出值也不结束。所以,它会等待所有的流去发出值

如果某个输入的Observable发出值后完成了,当其他的输入Observable发出值的时候,combineLatest返回Observable仍然会发出值。对于完成的输入Observable,它的值一直是最后发出的值。

如果某个输入Observable发生了错误,combineLatest也会立马触发错误状态,所有的其他输入Observable都会被解除订阅。

combineLatest接受一个可选的参数投射函数,它接收返回的Observable发出的值。投射函数可以返回任何数据,这些数据代替默认的数组被返回Observable发出。需要注意的是,投射函数并不接受值的数组,而是值的本身。这意味着默认的投射函数就是一个接受所有参数并把他们放到一个数组里面的函数。

例如:

1
2
3
4
5
6
7
import {of, combineLatest} from "rxjs";

const height$ = of(1.73, 1.85, 1.55);
const weight$ = of(80, 72);
combineLatest([height$, weight$]).subscribe(([h, w]) => {
console.log(w / (h * h));
});

combineLatest的基本用法。

LINK:

码字辛苦,打赏个咖啡☕️可好?💘