代码之家  ›  专栏  ›  技术社区  ›  Emanuel Pinho

满足条件时的可观测停止序列

  •  2
  • Emanuel Pinho  · 技术社区  · 6 年前

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

    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的可观察算子链应该是什么?

    1 回复  |  直到 6 年前
        1
  •  2
  •   martin    6 年前

    如果需要进行单独的异步以确定每个项是否有效,可以简单地使用 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(...);