使用RxJS将Observable [A list]转换为Observable [B list]

时间:2015-11-10 22:50:15

标签: javascript reactive-programming rxjs

我想找到函数遍历,并在JavaScript中申请Observable [A]。首先,用文字:

我有一个Observable [A list],我想对列表中的每个项目并行应用一个函数(A - > Observable [B]),并将它们连接到一个Observable [B list]然后我可以消费。

或者在类型签名中,我想找到this functionvar els = document.getElementsByClassName("txtSmall"); if (els[0]) els[0].value = "888"; if (els[1]) els[1].value = "433"; if (els[2]) els[2].value = "3017"; 。怎么做?

2 个答案:

答案 0 :(得分:2)

例如,您可以使用source.flatMap(function(a_list){ return Rx.Observable.zip(a_list.map(f))}))

source :: Observable List A
a_list :: List A
f :: A -> Observable B
a_list.map(f) :: List Observable B
Rx.Observable.zip :: List Observable B -> Observable List B
flatMap :: Observable List A -> (List A -> Observable List B) -> Observable List B

Rx.Observable.combineLatest应该相同而不是zip。如果flatMap存在于第一位(仅存在于实例级别),则Rx.Observable.flatMapLatest可以替换为Rx.Observable.concatMap,但如果您希望遵守某些顺序,则Zip可以替换为List Observable B

所以你可以匹配所需的签名,但这是你想要的逻辑吗?只要combineLatest中的某个观察点完成,List Observable B就会完成。 zip将为.concatMap(function (list) { return fromArray(list); })中除{1}之外的所有可观察对象重复先前发出的值。这些工作中的任何一个都适用于您的用例吗?您还可以设计一个npm install htmlparser2 的版本,该版本在列表中的所有可观察项完成时完成:cf。 RXJS: alternately combine elements of streams(删除最后一行 var input = "Hello This is Bikram"+ "<hello type="greeting">world</hello>"+ "<head>"+ "<meta charset="utf8"/>"+ "<title>Page Title</title>"+ "</head>"+ "<body>"+ "<a href="https://github.com/ForbesLindesay">"+ "<img src="/static/forkme.png" alt="Fork me on GitHub">"+ "</a>"+ "</body>"+ "Sample answer for stackoverflow!!!" )。

比照。 http://www.introtorx.com/content/v1.0.10621.0/12_CombiningSequences.html用于组合序列的运算符。

答案 1 :(得分:1)

这里是我最终如何解决它的问题,我可能会很好地向RxJS致敬,因为他们正在追踪&#39;并获得更多反馈:

Rx.Observable.prototype.traverse = function(f) {
  return this.
    // await the value O[b list]
    concatMap(xs =>
      Rx.Observable.from(xs). // lift into Rx monad
        concatMap(x => f(x)). // flatten to O[b] in same order as xs
        toArray()); // map from O[b] to O[b list]
};

const myStream = // O[A list] -> O[B list]
  filesSubj.traverse(file => fileReader(file).asDataURL())