Как связать оператор 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 здесь действительно изменяемая переменная, но нужно просто решить, является ли она проблемой или безвредной.