等待 BaconJS 中依赖流的最新值?

Wait for latest values from dependent streams in BaconJS?

我有 3 个流。 gradingResultcontextId 取决于 studentResponse。当所有 3 个事件都具有最新值时,我需要触发一个事件 并且只触发一个事件 (否则,这是微不足道的)。

我试过#combineTemplate 和#sampledBy studentResponse。不幸的是,我总是看到错误的数据---gradingResultcontextId 在组合模板中有旧值。如何等待所有流都具有最新值?

代码如下:

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);