【发布时间】:2015-06-26 05:36:21
【问题描述】:
我正在尝试在 BaconJs 中做这个相对复杂的操作。
基本上,这个想法是不断尝试每个check,直到您获得“通过”状态或者它们都失败了。问题是“待定”状态有一个可解决检查的 Observables 列表(由 jquery ajax 请求构建)。出于性能原因,您需要按顺序尝试每个 Observable,直到它们全部通过或一个失败。
这是完整的伪算法:
- 检查每项检查。
check包含id和status= 失败/通过/待定。如果挂起,它包含observables的列表。- 如果 status = pass,则返回 id(大功告成!)
- 如果状态 = 失败,则尝试下一次检查
- 如果状态 = 待定
- 按顺序尝试每个 observable
- 如果可观察到的结果为“假”,则尝试下一次检查
- 如果到达可观察列表的末尾并且结果为“真”,则返回 id(大功告成!)
- 按顺序尝试每个 observable
这是培根代码。当 Observables 是 Ajax 请求时,它不起作用。 基本上,发生的事情是它跳过了待处理的检查......它不等待 ajax 调用返回。如果我将 log() 放在 filter() 之前,它不会记录挂起的请求:
Bacon.fromArray(checks)
.flatMap(function(check) {
return check.status === 'pass' ? check.id :
check.status === 'fail' ? null :
Bacon.fromArray(check.observables)
.flatMap(function(obs) { return obs; })
.takeWhile(function(obsResult) { return obsResult; })
.last()
.map(function(obsResult) { return obsResult ? check.id : null; });
})
.filter(function(contextId) { return contextId !== null; })
.first();
更新:当检查如下所示时代码有效:[失败,失败,待定]。但是当检查看起来像这样时它不起作用:[失败,挂起,通过]
【问题讨论】:
-
所以检查应该彼此并行评估?
-
没有按顺序检查。在清除当前检查之前,您无法尝试下一次检查
-
听起来你实际上是在寻找承诺,那么。虽然 iirc Bacon 的 fire-once 属性和
flatMap具有相同的语义。 -
对于此类问题,使用 jsfiddle 或 jsbin 的工作示例将非常有用。
标签: functional-programming frp rxjs bacon.js