我想找到函数遍历,并在JavaScript中申请Observable [A]。首先,用文字:
我有一个Observable [A list],我想对列表中的每个项目并行应用一个函数(A - > Observable [B]),并将它们连接到一个Observable [B list]然后我可以消费。
或者在类型签名中,我想找到this function:var 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";
。怎么做?
答案 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())