使用 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)
})
}
})
});
我有以下 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)
})
}
})
});