我有一个位置,我有一系列的值。
对于这些变量中的每一个,我想调用一个observable,但只能在之前的observable完成之后。
是否有更多的“RxJS”方式来执行以下操作?
let num = 0;
let myObs = new Observable(observ => {
observ.next(1);
})
let content=['x','y','z'];
myObs.subscribe(data => {
let i = 0;
let that = this;
let inlineFunc = function(){
if ( i < content.length){
that.gen(num).subscribe(() => {
i++;
inlineFunc();
});
}else{
observer.next(doc);
}
};
inlineFunc();
});
gen(num:number) : Observable < any >{
return num*num;
},
答案 0 :(得分:0)
如果您想要不断重复调用observable
,可以使用Observable.expand()
。
假设您有一系列内容:
let content=['x','y','z'];
对于内容中的每个值,您需要调用gen()
函数,该函数返回一个Observable:
gen(num: number): Observable<any> {
return Observable.of(num * num);
}
你能做的是
let myObs = Observable.of(1);
let num = 0;
let content = ['x','y','z'];
const gen = (num: number): Observable<any> => {
return Observable.of(num * num);
}
myObs
.expand(()=>{
return gen(num);
})
.skip(1)
.take(content.length)
.subscribe(x=>console.log(x));
说明:
.expand()
将重复调用函数传递给自身(作为第一个参数),直到你要求他停止。在这种情况下,它将调用gen()
(返回一个可观察的)
.skip(1)
将跳过第一次发射,其中myObs
是值为1的可观察值。
.take()
将结束永远持续的.expand()
。它在这里做的是,只重复content
的长度。
.subscribe()
获取结果。
评论:您将获得以下输出:
0
0
0
0
因为你的num
是0.我假设gen()
只是一些虚拟函数,你将用一些返回真实有意义数据的Observable替换。
工作JSBin
答案 1 :(得分:0)
您可以先使用from运算符获取值的可观察值,然后使用reduce,
Observable.from([...values])
.reduce( this.reducingFn, 1 )
reducingFunction是一个接受2个参数的函数,第一个是起始值(它是reduce函数中的第二个参数),第二个是外部流发出的当前值(values数组中的每个值)< / p>
// somewhere in you class
reducingFn( accumulatedValue, value){
return accumulatedValue * value
}