我想从API响应中进行管道和过滤,但响应格式如下:
JSON:
{activeAwards:({名称:"x",状态:"有效的"},{名称:' y ',状态:"有效的"},{名称:"z",状态:"无效"}]}
我试过点击进入"activeAwards"并过滤它。
代码:
.pipe(
tap(data => {
data.activeAwards.filter(award =>
award.status === 'valid';
);
})
)
.subscribe(response => {
console.log(response);
}),
catchError(error => {
return error;
});
但是根据上面的代码,我得到了所有3个对象,也就是它们的全部,应该是2个对象
tap不会改变流数据,filter不会改变输入数组。相反,使用map并分配过滤器结果。
.pipe(
map(data => {
return {
...data,
activeAwards: data.activeAwards.filter(award => award.status === 'valid');
};
}),
).subscribe(response => {
console.log(response);
}),
catchError(error => {
return error;
});
在本例中,您希望将map
添加到筛选数组中,因为您正在更改需要传递到订阅的数据:
.pipe(
// catch the error before transforming the stream to prevent runtime errors
catchError(() => {...})
map((data) => {
data.activeAwards = data.activeAwards.filter(...);
return data;
})
).subscribe(() => {
//handle the data
});
catchError
需要在回调中返回一些东西。您可以返回EMPTY
(从rxJs
导入)以导致流永远不会击中订阅块,或者您可以返回of(null)
并在订阅中添加null值的处理。
.pipe(
catchError(err => {
return of(null)
// or return EMPTY - the subscribe block will not run in this case.
})
).subscribe(res => {
if(res) {
//handle the result
}
})