gpt4 book ai didi

javascript - 让不同的 Bacon.js 流在同一个间歇窗口中计算它们的值

转载 作者:行者123 更新时间:2023-11-30 05:30:45 24 4
gpt4 key购买 nike

也许,有了 Bacon.js 锤子在手,一切都开始看起来像钉子了。但这感觉像是一个可以用它优雅地解决的问题,而且我还没有足够的经验来弄清楚。

我的应用程序中的许多地方都需要有自己的 Bacon.EventStream。计算这些不同流的值需要一些昂贵的设置和分解:

var stream1 = Bacon.fromPoll(100, function () {
setup(); // expensive
var result = compute1(); // cheap
breakdown(); // expensive
return new Bacon.Next(result);
});

// similar for stream2, stream3, etc.

但所有此类流的设置和分解都是相同的。因此,将尽可能多的这些计算组合在一起是有意义的:

Bacon.interval(100, function () {
setup();
// compute value for property1
// compute value for property2
// compute value for property3
// ...
breakdown();
});

但是所有这些独立的流都将在代码中的不同位置设置,并且可能具有不同的轮询率等。他们每个人都应该等待下一个可用的窗口来计算他们的值(value)。节奏将由提供此窗口的某些全局流设置。

  1. 绝不应在窗口外执行计算。
  2. 应将尽可能多的计算分组在同一个窗口中。
  3. 如果没有要执行的计算,最好不要发生设置和分解。

我一直在玩,JSFiddle here是迄今为止我想到的最好的。但是(1)这是不正确的; .skipWhile(property) 似乎只跳过一次,(2) 代码看起来已经太复杂了。你能做得更好吗?


编辑:我更新了 JSFiddle .它现在工作正常。但我想知道我是否在使用最佳实践。这段代码可以简化吗?

最佳答案

我重构了您的 fiddle ,将窗口化计算作为单个函数提供并添加了缓冲,因此传入值会被缓冲到下一个可用窗口。 See updated jsFiddle.

function calculationWindow(pacing) {
var wantedBus = new Bacon.Bus();
var open = new Bacon.Bus();
var close = new Bacon.Bus();

pacing.filter(wantedBus.toProperty(false))
.onValue(function () {
console.log('<window>');
open.push();
wantedBus.push(false);
close.push();
console.log('</window>');
});

return function (stream) {
wantedBus.plug(stream.map(true))
return close.startWith(true).flatMapLatest(function() {
return stream.takeUntil(open).reduce([], function(arr, val) {
var a = arr.slice(0);
a.push(val);
return a;
}).flatMap(Bacon.fromArray)
})
}
}

在集中位置执行此操作的好处是您可以创建一次窗口处理,然后使用结果函数包装任何流。

编辑:如果您不想缓冲值,而是只关心最新值,您可以将返回的函数简化为:

return function (stream) {
wantedBus.plug(stream.map(true))
return close.startWith(true).flatMapLatest(function() {
return open.map(stream.toProperty())
})
}

http://jsfiddle.net/omahlama/omp0xr2c/2/

关于javascript - 让不同的 Bacon.js 流在同一个间歇窗口中计算它们的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27207508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com