将RxJS中的可观察对象从数组链接到函数中

时间:2017-07-20 15:14:49

标签: typescript rxjs

我有一个位置,我有一系列的值。

对于这些变量中的每一个,我想调用一个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;
  }, 

2 个答案:

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

说明:

  1. .expand()将重复调用函数传递给自身(作为第一个参数),直到你要求他停止。在这种情况下,它将调用gen()(返回一个可观察的)

  2. .skip(1)将跳过第一次发射,其中myObs是值为1的可观察值。

  3. .take()将结束永远持续的.expand()。它在这里做的是,只重复content的长度。

  4. .subscribe()获取结果。

  5. 评论:您将获得以下输出:

    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
}