我已经建立了一个可观察对象,基本上可以为数组中的每个项目调用一个终结点,但是随后我需要将这些项目合并在一起,然后发布到订阅“ next”。现在,根据数组中的总数,将执行“下一个”订阅N次,有什么想法吗?这是我的代码
from(items)
.pipe(
concatMap(item => {
return this.httpClient.get("https://randomuser.me/api/")
}),
tap(items => {
debugger
})
)
.subscribe(
result => {
debugger
},
error => {
debugger
}
)
我尝试将mergeAll放置在TAP之前,但是它崩溃了。
有什么想法吗?
预先感谢
答案 0 :(得分:1)
toArray()
将积累一系列响应,reduce()
可用于以更灵活的方式重现toArray()
的行为:您可以应用更复杂的合并逻辑(例如忽略重复的条目或whatsnot)。P.S。不确定,但是可能是您设计错误的情况。与其在此处使用累积,不如希望可以观察到一个更高的顺序,以便您的使用者不需要显式地使用数组,并且底层逻辑更加分离。
好吧,事实是您可以认为toArray()
是归约的特例。让我们从签名开始:reduce(accumulator: function, seed: any): Observable
。因此,第二个参数seed
是您从其开始的初始值(如果要减少的流为空,则seed
是唯一的结果)。如果toArray()
seed
只是[]
-一个...空的数组!然后,第一个参数accumulator
是一个使用(result, current)
-两个参数的函数,其中result
代表到目前为止的结果,而current
代表“尚未归约”流的元素。因此,result
的类型为array
,current
的类型可以是您的流的类型,在您的情况下-我猜是http响应。 (result, current) => { result.Add(current); return result; }
-这是最简单的实现,它将为您提供toArray()
的行为。但是,您可以做更多的事情,例如决定不添加current
(如果过时或无效),这就是为什么我告诉您reduce()
功能更强大的原因。
P.P.S。如果您想知道兔子的洞有多深,那么reduce
(在Haskell和其他功能语言中也称为foldl
)基本上就是递归模式。通过递归定义的大多数内容(但绝对不是全部!)可以用适当的reduce
和seed
参数重写为accumulator
;例如,通过缩减实现filter
非常容易。 See this question to find out more。