Angular RxJs:在concapMap之后合并所有值,以便它们在subscribe中一起发出;“下一步”;事件
我已经设置了一个observable,基本上为数组中的每个项目调用端点,但是在发布到订阅“next”之前,我需要将这些项目合并在一起。现在,根据数组中的总数,subscribe“next”被执行N次,有什么想法吗?这是我的密码Angular RxJs:在concapMap之后合并所有值,以便它们在subscribe中一起发出;“下一步”;事件,angular,rxjs,observable,Angular,Rxjs,Observable,我已经设置了一个observable,基本上为数组中的每个项目调用端点,但是在发布到订阅“next”之前,我需要将这些项目合并在一起。现在,根据数组中的总数,subscribe“next”被执行N次,有什么想法吗?这是我的密码 from(items) .pipe( concatMap(item => { return this.httpClient.get("https://randomuser.me/api/")
from(items)
.pipe(
concatMap(item => {
return this.httpClient.get("https://randomuser.me/api/")
}),
tap(items => {
debugger
})
)
.subscribe(
result => {
debugger
},
error => {
debugger
}
)
我试着在水龙头前放一个mergeAll,但它崩溃了
有什么想法吗
提前感谢
将累积一系列响应toArray()
可用于以更灵活的方式再现reduce()
行为:您可以应用更复杂的合并逻辑(如忽略重复条目或其他)toArray()
好吧,问题是你可以认为,
toArray()
是一种非常特殊的缩减情况。让我们从签名开始:reduce(累加器:函数,种子:任意):Observable
。因此,第二个参数seed
,是您开始的初始值(如果您试图减少的流为空seed
是唯一的结果值)。如果是toArray()
seed
只是[]
-一个。。。空的。。。阵列!然后是第一个参数,累加器
,它是一个采用(结果,当前)
-两个参数的函数,其中结果
表示到目前为止的结果,当前
表示流的“尚未减少”元素。因此,result
的类型是array
,current
的类型可以是您流的任何类型,在您的情况下,我猜是http响应(result,current)=>{result.Add(current);return result;}
-这是最简单的实现,它将为您提供toArray()
行为。但是,您可以做更多的事情,比如如果current
已经过时或无效,您可以决定不添加它,这就是为什么我告诉您reduce()
功能更强大的原因
p.p.S.如果你想知道兔子洞有多深,那么
reduce
(在Haskell和其他函数语言中也被称为foldl
)基本上就是递归模式。通过递归定义的大部分内容(但肯定不是全部!)都可以重写为reduce
,使用适当的seed
和累加器
参数;例如,通过精简实现过滤器
非常容易 使用forkJoin()
或toArray()
。如何在HTTP
请求下使用item
?目前HTTP请求下未使用item,但它只是一个测试url。但最终在项下会有一个id,我将使用此id调用端点id@martin使用forkJoin?如果我把叉形接头放在concatMap管道之后,它似乎不起作用,你有例子吗?谢谢!你有reduce的例子吗?我已经试过了,这似乎奏效了。