1

我遇到了一种情况,我基本上需要做类似下面的事情。

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 仅在运行时已知。我怎样才能以“功能方式”实现它而不诉诸命令式for循环或一些可变变量?

4

2 回答 2

2

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

param.reduce(function(o, p) {
    return o.flatMap(bar(p)); // probably inline the bar call
}, observableFoo);
于 2014-09-23T18:35:49.270 回答
0
var i = 0;
observableFoo
  .expand(function (x) { 
    return Rx.Observable.just(x).flatMap(bar(param[i++]));
  })
  .take(N)

查看expand的文档,并以这个JSFiddle为例。这里的ivar 确实是一个可变变量,但只需要判断它是有问题还是无害。

于 2014-09-23T18:03:34.663 回答