Rxjs 在mergeMap中使用concat

Rxjs 在mergeMap中使用concat,rxjs,rxjs6,Rxjs,Rxjs6,我很难理解与在操作符中使用函数相关的内容 concat的文档说明 您可以传递观察值数组,也可以将它们直接作为参数 当我直接将观察值作为参数,如下面的示例中所示,我在控制台中正确地得到了20和24 of(4) .pipe( mergeMap(number => concat(of(5 * number), of(6 * number))) ) .subscribe(value => console.log(value)); 但当我把它们作为一个数组,然后在控制台中

我很难理解与在操作符中使用函数相关的内容

concat
的文档说明

您可以传递观察值数组,也可以将它们直接作为参数

当我直接将观察值作为参数,如下面的示例中所示,我在控制台中正确地得到了20和24

of(4)
  .pipe(
    mergeMap(number => concat(of(5 * number), of(6 * number)))
  )
  .subscribe(value => console.log(value));
但当我把它们作为一个数组,然后在控制台中,我得到的是观察值,而不是它们的值:

of(4)
  .pipe(
    mergeMap(number => concat([of(5 * number), of(6 * number)]))
  )
  .subscribe(value => console.log(value));
这里有一场闪电战


知道为什么吗?这两个例子不应该工作相同吗?

这两个场景是不同的,它们不应该工作相同
concat
将可观测数据作为参数,它将顺序订阅这些流,并且仅在前一个流完成时订阅下一个可观测数据。每个操作符或创建方法都返回一个可观察的。这意味着在第一个示例中,当您使用
concat
时,它将返回一个发出
20
然后发出
24
的可见光。因为您要处理嵌套的可观察对象,所以必须使用
mergeMap
,它将订阅
concat
返回的结果可观察对象

现在在第二个示例中,如果传入一个数组,
concat
会将其(在内部使用
from()
)转换为一个发出2个值的可观察值,并且这些值也是可观察值。这里有三个嵌套层次。第一个是最外部的可观察对象,即源,它是(4)中的
,第二个级别是在
mergeMap
中映射到的级别,第二个示例中的第三个级别是数组中的可观察对象。问题是,你只会将级别展平到第2级,而不是第3级。同样,在您的第二个示例中,
mergeMap
返回的Observable发出两个Observable,但它们只是代理,而不是这些Observable发出的值。如果您也想订阅这些,您可以像这样链接到另一个
mergeMap

concatArray() {
  of(4)
    .pipe(
      mergeMap(number => concat([of(5 * number), of(6 * number)])),
      mergeMap(x => x)
    )
    .subscribe(value => console.log(value));
}
另一种方法是扩展阵列,以便
concat
不接收类似
阵列的对象,而是直接观察到:

concatArray() {
  of(4)
    .pipe(
      mergeMap(number => concat(...[of(5 * number), of(6 * number)]))
    )
    .subscribe(value => console.log(value));
}
两者都将打印出:

20
24

我希望这能使这一点更加清楚,并描述第一个和第二个示例之间的差异。

这很可能是文档中的错误。但是,您可以使用
concat(…[o1,o2])
或像第一个示例那样直接发送观测值。但是,我认为文档中没有错误,因为签名表明数组被接受
concat(…observables:Array):当您使用
…rest
语法时,需要使用可观察的
数组
。此解释非常清楚。谢谢!散布阵列也是@martin建议的。因此,我可以从中得出结论,
concat
的文档肯定是错误的。其中一个例子是传递数组。这就是为什么我认为我的两个例子应该是相同的。描述本身表明可以传递数组。这应该是固定的。再次感谢!不客气!是的,这应该在文档中更正。它不会打印出那些计时器的值,而只是控制台记录可观察的对象。但是您必须订阅这些可观测值,以获得发出的值或传播数组。