使用 reduce 运算符的 Observable 订阅错误

Error in a Observable subscription using reduce operator

我有以下 rxjs observable:

export interface SubExperimentData {
    experimentId: number;
      name: string;
      subexperiment: {
        name: String
        avg: number;
        max: number;
      }[];
}

我现在想做的是获取特定实验的所有子实验。我使用以下代码从一个实验中获取所有子实验数据。

choosedExperiment 包含我想要得到的子实验的选定实验。

this.subexperimentData.pipe(map((extractedSResult) => {
        extractedSResult.reduce((extractedSResult) => { //Error
          if(extractedSResult.name == this.choosedExperiment) {
            extractedSResult.subexperiment.forEach((t) => {
              this.SubTaskAvg.push(t.avg)
              this.SubTaskName.push(t.name)
              }
            )
          }
        }
        )                                                                         
      }
      )).subscribe();
    });

错误:TS2345:类型为“(extractedSResult: SubExperimentData) => void”的参数不可分配给类型为“(previousValue: SubExperimentData, currentValue: SubExperimentData, currentIndex: number, array: SubExperimentData[]) = > 子实验数据'。 类型 'void' 不可分配给类型 'SubExperimentData'.

我不太确定为什么会出现此错误。不幸的是,我不知道错误来自哪里。对于专业人士来说可能很清楚,但作为新手我不明白。代码的基础来自另一个我已经解决的问题。不幸的是,我只理解代码的 90% 为什么我不知道问题的解决方案。谢谢!

不清楚您要完成什么

extractedSResult 的类型是什么?你有 extractedSResult.reduce 的事实让我相信它是一个可迭代的(也许是某种数组?)如果是这样,也许将变量复数化,使其成为 extractedSResults。您在传递给 reduce 的 lambda 中隐藏相同的变量名。 extractedSResult 的类型是什么?看起来 SubExperimentData 可能是类型。

在 reduce 中,您正在对一些全局变量做一些事情。看起来您在某种类型的两种数据结构(堆栈或数组等)中累积值。但你没有 returning 任何东西。这意味着这个函数的 return 类型是 void.

你的错误是什么意思

错误告诉您传递给 reduce 的 lambda 是错误的。查看 reduce 的工作原理,它需要一个 lamda,其中第一个值是累加值,第二个值是当前迭代的值(通常你也需要累加值的种子值)。

最后,reduce 也期望有一个 return 类型。特别是,它需要return新的累积数据。

您的 lambda 不满足这些条件中的任何一个。

寻求解决方案

很难确定您在这里试图做什么。如果你追求的只是副作用,你可以直接把代码扔到subscribe的回调中。您还想要 forEach 而不是 reduce

this.subexperimentData.subscribe(extractedSResults => {
  extractedSResults.forEach(extractedSResult => {
    if(extractedSResult.name == this.choosedExperiment) {
      extractedSResult.subexperiment.forEach(t => {
        this.SubTaskAvg.push(t.avg)
        this.SubTaskName.push(t.name)
      })
    }
  })    
});