我有一个对象数组,我需要调用一个在每个对象上返回可观察值的服务,但是如果要满足某些条件(例如,服务返回错误),我想停止该序列。
const array = [
{name: 'A', valid: true},
{name: 'B', valid: true},
{name: 'C', valid: false},
{name: 'D', valid: true}
];
const fnc = (obj) => {
console.log(obj.name);
return of(obj.valid).pipe(delay(500));
};
在这种情况下,仅用于记录A和B的Observable运算符链应该是什么?
答案 0 :(得分:2)
如果您需要进行单独的异步处理以找出每个项目是否有效,则可以简单地使用concatMap
:
from(array).pipe(
concatMap(obj => http.get(...).pipe(mapTo(obj))),
})
.subscribe(...);
您说过,当某项无效时,服务会返回错误,因此,如果http.get
调用失败,则concatMap
会发出错误消息。
但是,如果您只想完整地完成链接而不会发出错误(或者如果该项无效则服务不会发出错误),则可以使用takeWhile()
:
from(array).pipe(
concatMap(obj => http.get(...).pipe(
map(valid => {
obj.valid = valid;
return obj;
}),
)),
takeWhile(obj => obj.valid),
})
.subscribe(...);