RxJs zip操作符仅取发送流首个值,其余值为何未输出?
RxJS zip操作符剩余值未输出原因说明
zip操作符的核心运行逻辑是:必须收集到所有输入流在相同索引位置的发射值后,才会将这组值组合为数组向外发射,只要任意一个输入流完成且无更多值可配对,整个zip流就会直接终止,其余流中未完成配对的剩余值会被直接丢弃。
对应你给出的代码,三个参与zip组合的流发射情况如下:
- 第一个流
of(1, 2, 3):共发射3个值,发射顺序为1 → 2 → 3,发射完成后终止 - 第二个流
of(5):仅发射1个值5,发射后立即终止 - 第三个流
of(10):仅发射1个值10,发射后立即终止
运行时的配对流程为:
- 第一轮配对:三个流分别拿出各自的第一个发射值1、5、10,组合为
[1,5,10]输出 - 进入下一轮配对检测时,第二个和第三个流都已经终止,没有对应索引位置的新值可以参与配对,
zip流直接停止运行 - 第一个流剩余的2、3因无法找到另外两个流的对应配对值,被直接丢弃,因此不会出现在输出结果中。
如果需要让of(1,2,3)的三个值都参与输出,需要保证另外两个参与zip的流也至少发射3个值,示例修改如下:
of(1, 2, 3) .pipe(zip(of(5, 6, 7), of(10, 11, 12))) .subscribe((a) => console.log(a));
修改后运行输出为:
[1,5,10] [2,6,11] [3,7,12]
内容的提问来源于stack exchange,提问作者ben berizovsky
相关产品推荐
相关产品推荐

