【问题标题】:Concatenate rxjs Observables连接 rxjs Observables
【发布时间】:2016-07-13 06:41:34
【问题描述】:

是否可以连接多个可观察对象?

例如: 我有 3 个功能:

ensureUserLogged():Observable<boolean>

createEntity():Observable<Entity>

checkEntity():Observable<boolean>

我想做这样的事情:

Observable.combine (ensureUserLogged(), createEntity(), checkEntity()).subscribe (
    checkEntityResult => console.log (checkEntityResult),
    error => console.log (error)
);

或类似的东西:

ensureUserLogged().then (logged => createEntity()).then (newEntity => checkEntity ())...

否则我需要写一个丑陋的金字塔:

ensureUserLogged().subscribe (
    res => {
        createEntity ().subscribe (
            res => {
                checkEntity ().subscribe (
                    res => { console.log ("I'm finally here") },
                    error {}
                )
            },
            err => {
            }
        );
    },
    err => {
    }
)

有什么事情可以实现我的意志吗?

谢谢

【问题讨论】:

    标签: typescript angular rxjs observable rxjs5


    【解决方案1】:

    并行执行需要使用Observable.forkJoin

    Observable.forkJoin(ensureUserLogged(), createEntity(), checkEntity()).subscribe (
      checkEntityResult => console.log (checkEntityResult),
      error => console.log (error)
    );
    

    checkEntityResult 将对应一个包含每个元素的数组:第一个为ensureUserLogged 的结果,...

    按顺序执行,您需要使用flatMap 运算符:

    ensureUserLogged().flatMap((resultOfEnsureUserLogged) => {
      return createEntity();
    }).flatMap((resultOfCreateEntity) => {
      return checkEntity();
    }).subscribe((resultOfChekEntity) => {
      (...)
    });
    

    您会注意到您可以混合使用。比如这样的:

    ensureUserLogged().flatMap((resultOfEnsureUserLogged) => {
      return Observable.forJoin(createEntity(), checkEntity());
    }).subscribe((resultOfCreateEntityAndChekEntity) => {
      (...)
    });
    

    【讨论】:

    • 谢谢,如果createEntity(第二个Observable)需要前一个Observable的结果呢?
    • 编辑:谢谢蒂埃里,所以使用 flatMap 的最后一个订阅还包含以前的方法抛出的任何异常?
    • 事实上,上一个 observable 的结果就是你收到的 flatMap 回调的参数。
    • 对于可观察对象,错误/异常对链来说是全局的。在链尾订阅时,第二个回调将收到任何错误(来自不同级别)
    • 官方文档里应该有这样的例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 2016-09-07
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多