从数据数组中创建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并将所有这些链接在一起的主要内容,如果未能解决你的问题,请参考以下文章
如何从数组中创建一个在一行中显示多个 UIImageViews 的类?
在 C 中创建一个 void toBST 函数,它接受 2 个参数:Tree* root 和一个数组,并将所有树节点添加到一个数组中 - 顺序无关紧要