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

时间:2015-09-02 04:46:44

标签: functional-programming reactive-programming rxjs frp bacon.js

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

链接到jsfiddle:https://jsfiddle.net/3o4c9sm8/1/

更新:这是一个人为的例子。在实际代码中,gradingResult是一个ajax请求。 gradingResult和contextId都对studentResponse

有时间依赖性

2 个答案:

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