Angular 从一系列数据中创建可观测数据,并将所有这些数据链接在一起

Angular 从一系列数据中创建可观测数据,并将所有这些数据链接在一起,angular,rxjs,rxjs5,Angular,Rxjs,Rxjs5,我有以下要求: 我有一组数据 对于数组中的每个项目,我需要执行一个调用,以产生一个可观察的 我需要把所有这些可观测的东西连在一起 如果其中一个观察结果导致错误响应,我需要返回false 不必继续进行进一步观察 上下文是一个角度保护,它使用canActivate()返回一个可观察的 我希望避免在guard中使用以下构造(伪代码): //要检查的操作 变量操作=['x','y','z']; canActivate():可观察的{ 返回此.performAction(操作[0])。订阅(结果=

我有以下要求:

  • 我有一组数据
  • 对于数组中的每个项目,我需要执行一个调用,以产生一个可观察的
  • 我需要把所有这些可观测的东西连在一起
  • 如果其中一个观察结果导致错误响应,我需要返回false
    • 不必继续进行进一步观察
上下文是一个角度保护,它使用canActivate()返回一个可观察的

我希望避免在guard中使用以下构造(伪代码):

//要检查的操作
变量操作=['x','y','z'];
canActivate():可观察的{
返回此.performAction(操作[0])。订阅(结果=>{
如果(结果){
此.performation(操作[1]).subscribe(结果2=>{
如果(结果2){
this.performAction(actions[2]).subscribe(result3=>{
...
};
}
});
}
//结果=假;
};
}

您可以这样做:

import { Observable, Subject, ReplaySubject } from 'rxjs';

const actions = ['x', 'y', 'z'];

const performAction = (action): Observable<boolean> => {
  if (action === 'y') {
    return Observable.of(false);
  }
  return Observable.of(true);
}

const observable = Observable.from(actions)
  .concatMap(a => performAction(a))
  .multicast(new ReplaySubject(1),
    s => s.takeWhile(result => result !== false).concat(s.take(1))
  );

observable.subscribe(console.log);

performAction总是返回Observable,我需要将整个表达式分配给一个Observable(如果所有内容都返回true,则为true)。给定此代码,我将如何执行此操作?thanks@stephan.peters然后将其存储在一个变量中,请参见我的编辑但我发现了以下类型脚本错误,并且在实时演示中也看到:类型为“ReplaySubject”的参数不能分配给类型为“(this:Observable)=>Subject”的参数。[0]类型为“ReplaySubject”的参数与签名不匹配”(this:Observable):Subject'。stackblitz上的错误实际上是错误的,它认为参数需要是一个函数,但您也可以传递一个
Subject
实例。您可以将Subject替换为
()=>新的ReplaySubject(1)
,它也可以工作。
import { Observable, Subject, ReplaySubject } from 'rxjs';

const actions = ['x', 'y', 'z'];

const performAction = (action): Observable<boolean> => {
  if (action === 'y') {
    return Observable.of(false);
  }
  return Observable.of(true);
}

const observable = Observable.from(actions)
  .concatMap(a => performAction(a))
  .multicast(new ReplaySubject(1),
    s => s.takeWhile(result => result !== false).concat(s.take(1))
  );

observable.subscribe(console.log);
true
false