2014-07-04 3 views
0

끝난 스트림에서 물건을 할 필요가 있지만 .onEnd()이 아닌 것 같습니다. XHR 당 가져와 내 애플리케이션에 삽입해야하는 URL 목록이 있다고 가정 해 보겠습니다. 그 작업이 끝난 후에도 데이터에 의존하는 작업을 계속하고 싶습니다. 따라서이 작업을 병렬로 수행 할 수 없습니다. 나는 지금 이와 같은 것을 시도하고있다 :bacon.js에서 끝 이벤트를 어떻게 필터링합니까?

var data = Bacon.fromArray(myArray).flatMap(function(url) { 
    ... fetch per XHR and return ... 
}); 

data.onValue(function() { ... do something with data ... }); 

Bacon.onValues(
    otherValue, 
    data, 
    function(value, data) { 
     // I need to check whether data stream ended 
     // if (data.isEnd()) obviously doesn't work 
    } 
) 

뿐만 아니라 작동하지 않을뿐만 아니라 옳지도 않다. 이 작업을 올바르게 수행하려면 어떻게해야합니까?

EDIT : 나는 함께 작업하는 것을 해킹했습니다 : data.mapEnd('we are done').filter(function(v) { return v === "we are done"; }),하지만 나는 매우 더러운 해킹이라고 생각합니다. 거기에 더 순수한 게 없나요?

+0

이 경우 'onEnd'를 사용하면 무엇이 문제가됩니까? – Bergi

+0

@Bergi : 부작용 때문에 완벽합니다. 그러나 나는 다른 값 (아마'.sampledBy'와 함께)으로 끝 이벤트를 결합해야하므로 부작용 필드에 있지 않습니다. –

+2

data.mapEnd (무언가)를 사용하여 종료 이벤트를 다른 값 이벤트처럼 처리 할 수있는 값 이벤트로 변환 할 수 있습니다 – raimohanska

답변

1

첫 번째 활동의 상태 (즉, 어떤 URL을 가져 왔는지)를 속성에 저장 한 다음 속성이 '최종'상태에 도달하면 이벤트를 트리거합니다.

다음 코드로 문제가 해결 되었습니까?

var data = Bacon.fromArray(myArray).flatMap(fetchUrl) 
var cumulativeResults = data.scan([], function(acc, result) { return acc.concat([result]) }) 
// a nicer implementation would ensure that every URL has indeed been fetched 
var completed = cumulativeResults.filter(function(results) { return results.length == myArray.length }); 

completed.onValues(function(results) { 
    // proceed 
});