连接rxjs Observables

use*_*528 4 observable rxjs typescript rxjs5 angular

是否可以连接多个observable?

例如:我有3个功能:

ensureUserLogged():Observable<boolean>

createEntity():Observable<Entity>

checkEntity():Observable<boolean>
Run Code Online (Sandbox Code Playgroud)

我想做的事情如下:

Observable.combine (ensureUserLogged(), createEntity(), checkEntity()).subscribe (
    checkEntityResult => console.log (checkEntityResult),
    error => console.log (error)
);
Run Code Online (Sandbox Code Playgroud)

或类似的东西:

ensureUserLogged().then (logged => createEntity()).then (newEntity => checkEntity ())...
Run Code Online (Sandbox Code Playgroud)

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

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

有什么东西可以达到我的意愿吗?

谢谢

Thi*_*ier 8

您需要使用Observable.forkJoin并行执行:

Observable.forkJoin(ensureUserLogged(), createEntity(), checkEntity()).subscribe (
  checkEntityResult => console.log (checkEntityResult),
  error => console.log (error)
);
Run Code Online (Sandbox Code Playgroud)

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

连续执行事物,您需要使用flatMap运算符:

ensureUserLogged().flatMap((resultOfEnsureUserLogged) => {
  return createEntity();
}).flatMap((resultOfCreateEntity) => {
  return checkEntity();
}).subscribe((resultOfChekEntity) => {
  (...)
});
Run Code Online (Sandbox Code Playgroud)

你可以注意到你可以混合东西.例如,类似的东西:

ensureUserLogged().flatMap((resultOfEnsureUserLogged) => {
  return Observable.forJoin(createEntity(), checkEntity());
}).subscribe((resultOfCreateEntityAndChekEntity) => {
  (...)
});
Run Code Online (Sandbox Code Playgroud)