可观察-满足条件时停止的顺序

时间:2018-07-25 14:19:53

标签: javascript rxjs observable

我有一个对象数组,我需要调用一个在每个对象上返回可观察值的服务,但是如果要满足某些条件(例如,服务返回错误),我想停止该序列。

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运算符链应该是什么?

1 个答案:

答案 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(...);