2017-10-14 7 views
1

동일한 소스의 두 맵을 병합하여 결과의 ​​순서를 보장하고자합니다.스트림 병합을 주문하는 방법은 무엇입니까?

const source = xs.of(1,2,3) 
    const a = source.map(v=>v*10) 
    const b = source.map(v=>v*100) 
    const hist:number[] = [] 
    xs.merge(a,b).addListener({ 
    next: v=>hist.push(v), 
    }) 
    expect(hist).toEqual([10,100,20,200,30,300]) 

현재 내가지고있어 결과가 이것이다 : 여기에 내가하고 싶은 단위 테스트가 통과하는 것입니다

Expected value to equal: 
    [10, 100, 20, 200, 30, 300] 
Received: 
    [10, 20, 30, 100, 200, 300] 
+0

당신은 jsbin을 게시하시기 바랍니다 수 있을까? 그것은 쉽게 다음 실험하는 것입니다. – user3743222

답변

2

내가 xstream와 전문가는 오전, 그래서 내가 당신을 제안 할 수 해결책. 그러나 다른 스트리밍 라이브러리에서 흔히 볼 수있는 결과물을 얻는 이유를 설명 할 수 있습니다.

두 개의 소스를 병합했습니다. of 연산자는 배열 값을 순서대로 내보내도록 보장하지만 map 연산자는 수신 된 값과 같은 순서로 변환 된 값을 방출한다는 것을 보장합니다. 그러나 merge(a,b)은 a와 b의 값을 인터리브한다고 보장하지 않습니다 . a의 값을 순서대로 전달하고, b의 값을 순서대로 전달합니다 (즉, 결과 출력에서 ​​부분 순서 만 보장 함).

몇 가지 값을 방출 할 때 어떤 시간에 어떤 것이 방출되고 어떤 순서로 일정과 관련되는지에 대한 질문. 나는이 시점에서 xstream을 알지 못하고 있는데, 이로부터 스케쥴러 인터페이스를 노출 시켰고, 그로부터 당신은 값 방출의 스케쥴링을 사용자 정의 할 수 있었다. 따라서 기본 스케줄링에 바인딩됩니다.

지금 위로 순서대로 값들을 관찰하는 이유 :

  • 병합 (a가, B)가 어레이로부터 즉시 기적
    • 먼저 모든 값을 방출 연결
  • 병합 (a, b) 다음
    • B는 즉시 방출 SYN b에 연결 기적으로

당신이 1, 2, 3 동 기적 방출하지 않는 값을 얻고 싶은 경우에, 당신은 그렇게 할 of보다 다른 연산자를 사용하거나 명시 적으로 Timed 시퀀스를 구성하는 데 필요한 배열의 모든 값 즉, t0에서 1을, t0 + 1에서 2를, t0 + 2에서 3을 방출합니다.

+0

감사합니다, @ user3743222, 설명을 위해. 나는 라이브러리가이 유스 케이스에 대한 해결책을 가지고 있다고 생각했다. –

2

목록 periodic 시퀀스를 사용 user3743222's answer로부터 실마리 복용.

변경 :

//const source = xs.of(1,2,3) 
const source = xs.periodic(1).drop(1).take(3) 

을 ... 콘솔에서 생산 :

10 100 20 200 30 300 

ESNextbin 데모를.

drop(1)은 으로 시작하는 periodic을 처리하는 한 가지 방법입니다. 또는 map 함수에서 ++v*10을 사용할 수도 있습니다.

+0

감사! 소스 배열의 요점은 유용한 데이터를 포함하는 것이라고 생각합니다. 예제를 간단하게 만들기 위해 1,2,3으로 초기화했지만, 실제 상황에서는 데이터 레코드를 상태 문자열에 매핑해야하므로 소스 데이터를 주기적으로 바꿀 수는 없습니다. –