Как связать оператор flatMap с наблюдаемым для N раз, когда N известен только во время выполнения?

Я сталкиваюсь с ситуацией, когда мне нужно сделать что-то вроде ниже.

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 или некоторой изменяемой переменной?

2 ответа

Решение

Функциональным способом было бы сложить param массив (используя JavaScript .reduce метод):

param.reduce(function(o, p) {
    return o.flatMap(bar(p)); // probably inline the bar call
}, observableFoo);
var i = 0;
observableFoo
  .expand(function (x) { 
    return Rx.Observable.just(x).flatMap(bar(param[i++]));
  })
  .take(N)

Проверьте документацию для расширения, и этот JSFiddle для примера. i var здесь действительно изменяемая переменная, но нужно просто решить, является ли она проблемой или безвредной.

Другие вопросы по тегам