从数据数组中创建observable并将所有这些链接在一起

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从数据数组中创建observable并将所有这些链接在一起相关的知识,希望对你有一定的参考价值。

我有以下要求:

  • 我有一系列数据
  • 对于数组中的每个项目,我需要执行一个调用,从而产生一个Observable
  • 我需要将所有这些可观察的链接在一起
  • 如果其中一个observable导致错误响应,我需要返回false 进一步的可观察性不应该继续

上下文是Angular中的一个保护,它使用canActivate()返回一个Observable <boolean>

我想避免在后卫(伪代码)中进行构造:

// the actions to check
var actions = ['x', 'y', 'z'];

canActivate() : Observable<boolean> {
    return this.performAction(actions[0]).subscribe(result => {
      if(result){
        this.performAction(actions[1]).subscribe(result2 => {
           if(result2){
               this.performAction(actions[2]).subscribe(result3 => {
                 ...
               };
           }
       });
   }
   //result = false;
 };
}
答案

你可以这样做:

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);

查看现场演示(开放式控制台):https://stackblitz.com/edit/rxjs5-hnzwtt?file=index.ts

最重要的部分是multicast操作员,它通过所有东西,直到它收到false。然后这个false值是完成链之前的最后一个(感谢concat)。

输出是:

true
false

以上是关于从数据数组中创建observable并将所有这些链接在一起的主要内容,如果未能解决你的问题,请参考以下文章

从回调中创建一个 Observable

如何从数组中创建一个在一行中显示多个 UIImageViews 的类?

如何从无限流中创建Observable

在 C 中创建一个 void toBST 函数,它接受 2 个参数:Tree* root 和一个数组,并将所有树节点添加到一个数组中 - 顺序无关紧要

来自数组的 Observable 在 TypeScript 中不起作用

在子数组列表中创建并查找最大值