Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular RxJs:在concapMap之后合并所有值,以便它们在subscribe中一起发出;“下一步”;事件_Angular_Rxjs_Observable - Fatal编程技术网

Angular RxJs:在concapMap之后合并所有值,以便它们在subscribe中一起发出;“下一步”;事件

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/")

我已经设置了一个observable,基本上为数组中的每个项目调用端点,但是在发布到订阅“next”之前,我需要将这些项目合并在一起。现在,根据数组中的总数,subscribe“next”被执行N次,有什么想法吗?这是我的密码

   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的例子吗?我已经试过了,这似乎奏效了。