我有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);
链接到jsfiddle:https://jsfiddle.net/3o4c9sm8/1/
更新:这是一个人为的例子。在实际代码中,gradingResult是一个ajax请求。 gradingResult和contextId都对studentResponse
有时间依赖性答案 0 :(得分:1)
解决方案是通过最后更新的流进行采样。在这种情况下,它是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);
答案 1 :(得分:0)
看起来插入总线而不是推送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);