如何在一个observable上将flatMap运算符链接N次,其中N只在运行时知道?

时间:2014-09-23 06:44:48

标签: javascript rxjs

我遇到的情况是我基本上需要做类似下面的事情。

observableFoo
.flatMap(bar(param[0]))
.flatMap(bar(param[1]))
//...
.flatMap(bar(param[N]))

function bar(param){
  var fn = function(...){
     // return some observable depending on param
  }
  return fn;
}

其中N仅在运行时已知。如何以功能性的方式实现它"不采用命令式循环或一些可变变量?

2 个答案:

答案 0 :(得分:2)

一种功能性的方法是折叠param数组(使用JavaScript的.reduce方法):

param.reduce(function(o, p) {
    return o.flatMap(bar(p)); // probably inline the bar call
}, observableFoo);

答案 1 :(得分:0)

var i = 0;
observableFoo
  .expand(function (x) { 
    return Rx.Observable.just(x).flatMap(bar(param[i++]));
  })
  .take(N)

查看expand的文档,以及此JSFiddle的示例。这里的i var确实是一个可变变量,但只需要确定它是一个问题还是无害。