等待 BaconJS 中依赖流的最新值?
Wait for latest values from dependent streams in BaconJS?
我有 3 个流。 gradingResult
和 contextId
取决于 studentResponse
。当所有 3 个事件都具有最新值时,我需要触发一个事件 并且只触发一个事件 (否则,这是微不足道的)。
我试过#combineTemplate 和#sampledBy studentResponse
。不幸的是,我总是看到错误的数据---gradingResult
和 contextId
在组合模板中有旧值。如何等待所有流都具有最新值?
代码如下:
var studentResponse = new Bacon.Bus();
var gradingResult = new Bacon.Bus();
var contextId = new Bacon.Bus();
studentResponse.onValue(function(f) {
gradingResult.push(f);
contextId.push(f);
});
Bacon.combineTemplate({
studentResponse: studentResponse,
gradingResult: gradingResult,
contextId: contextId
}).sampledBy(studentResponse)
.onValue(function(t) {
console.log(t);
});
studentResponse.push(1);
studentResponse.push(2);
studentResponse.push(3);
Link 到 jsfiddle:https://jsfiddle.net/3o4c9sm8/1/
更新:这是一个人为的例子。在实际代码中,gradingResult 是一个 ajax 请求。 gradingResult 和 contextId 都对 studentResponse
有时间依赖性
看起来像插入总线而不是将值推入 studentResponse.onValue
就可以了:
var studentResponse = new Bacon.Bus();
var gradingResult = new Bacon.Bus();
var contextId = new Bacon.Bus();
gradingResult.plug(studentResponse);
contextId.plug(studentResponse);
Bacon.combineTemplate({
studentResponse: studentResponse,
gradingResult: gradingResult,
contextId: contextId
}).sampledBy(studentResponse)
.onValue(function(t) {
console.log(t);
});
studentResponse.push(1);
studentResponse.push(2);
studentResponse.push(3);
解决方案是按最后更新的流进行采样。在本例中,它是 contextId
。将代码更改为以下使其工作:
var studentResponse = new Bacon.Bus();
var gradingResult = new Bacon.Bus();
var contextId = new Bacon.Bus();
studentResponse.onValue(function(f) {
gradingResult.push(f);
contextId.push(f);
});
Bacon.combineTemplate({
studentResponse: studentResponse,
gradingResult: gradingResult,
contextId: contextId
}).sampledBy(contextId) //Sampling by stream that updates last <---
.onValue(function(t) {
console.log(t);
});
studentResponse.push(1);
studentResponse.push(2);
studentResponse.push(3);
我有 3 个流。 gradingResult
和 contextId
取决于 studentResponse
。当所有 3 个事件都具有最新值时,我需要触发一个事件 并且只触发一个事件 (否则,这是微不足道的)。
我试过#combineTemplate 和#sampledBy studentResponse
。不幸的是,我总是看到错误的数据---gradingResult
和 contextId
在组合模板中有旧值。如何等待所有流都具有最新值?
代码如下:
var studentResponse = new Bacon.Bus();
var gradingResult = new Bacon.Bus();
var contextId = new Bacon.Bus();
studentResponse.onValue(function(f) {
gradingResult.push(f);
contextId.push(f);
});
Bacon.combineTemplate({
studentResponse: studentResponse,
gradingResult: gradingResult,
contextId: contextId
}).sampledBy(studentResponse)
.onValue(function(t) {
console.log(t);
});
studentResponse.push(1);
studentResponse.push(2);
studentResponse.push(3);
Link 到 jsfiddle:https://jsfiddle.net/3o4c9sm8/1/
更新:这是一个人为的例子。在实际代码中,gradingResult 是一个 ajax 请求。 gradingResult 和 contextId 都对 studentResponse
有时间依赖性看起来像插入总线而不是将值推入 studentResponse.onValue
就可以了:
var studentResponse = new Bacon.Bus();
var gradingResult = new Bacon.Bus();
var contextId = new Bacon.Bus();
gradingResult.plug(studentResponse);
contextId.plug(studentResponse);
Bacon.combineTemplate({
studentResponse: studentResponse,
gradingResult: gradingResult,
contextId: contextId
}).sampledBy(studentResponse)
.onValue(function(t) {
console.log(t);
});
studentResponse.push(1);
studentResponse.push(2);
studentResponse.push(3);
解决方案是按最后更新的流进行采样。在本例中,它是 contextId
。将代码更改为以下使其工作:
var studentResponse = new Bacon.Bus();
var gradingResult = new Bacon.Bus();
var contextId = new Bacon.Bus();
studentResponse.onValue(function(f) {
gradingResult.push(f);
contextId.push(f);
});
Bacon.combineTemplate({
studentResponse: studentResponse,
gradingResult: gradingResult,
contextId: contextId
}).sampledBy(contextId) //Sampling by stream that updates last <---
.onValue(function(t) {
console.log(t);
});
studentResponse.push(1);
studentResponse.push(2);
studentResponse.push(3);