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

时间:2015-09-05 16:31:19

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

我有3个流。 (1)gradingResultcontextId是依赖studentResponse的ajax请求。 (2)对于每个studentResponse值,我需要使用studentResponse值和其他两个流的相应结果来触发事件。

这个问题与Wait for latest values from dependent streams in BaconJS?相似但不同。一个关键的区别是我不知道gradingResultcontextId中的哪一个将首先返回。

关于代码的说明:代码基于生产代码。我无权访问gradingResultcontextId。我所知道的是,他们是从studentResponse获取输入的ajax请求。

一些具有所需输出的示例代码:

function _fauxAjax(val) {
  return Bacon.fromBinder(function(sink) {
    setTimeout(function() { 
        sink(val); 
        sink(new Bacon.End());
    }, Math.random()*1000);
    return function() {}
  });
}

var studentResponse = new Bacon.Bus();
var gradingResult = studentResponse.flatMap(_fauxAjax);
var contextId = studentResponse.flatMap(_fauxAjax);

鉴于此输入:

studentResponse.push(1);
studentResponse.push(2);
studentResponse.push(3);

期望的输出:

{studentResponse:1, gradingResult:1, contextId:1 }
{studentResponse:2, gradingResult:2, contextId:2 }
{studentResponse:3, gradingResult:3, contextId:3 }

1 个答案:

答案 0 :(得分:2)

如果将后两个ajax请求定义为独立流,我没有看到确保值相关的实用解决方案。

因此,要确保您获得由同一gradingResult触发的contextIdstudentResponse响应,我会说您必须执行以下操作:

studentResponse.flatMap(function(response) {
  return Bacon.combineTemplate({
    studentResponse: response,
    gradingResult: _fauxAjax(response),
    contextId: _fauxAjax(response)
  })
}).log()