다음과 같은 관찰 가능 항목을 만드는 데 문제가 있습니다.
미리 정의 된 값 배열을 받길 원합니다.
다른 것들로 필터링하고 개별 관찰 가능 항목으로 작업 할 수 있습니다. 는 이러한 필터링 관찰 가능한 병합하는 데 시간이 올 때
그리고는, 나는 원래여러 번 관찰 할 수있는 ReactiveX 필터링 및 병합
//Not sure the share is necessary, just thought it would tie it all together
const input$ = Observable.from([0,1,0,1]).share();
const ones$ = input$.filter(n => n == 1);
const zeroes$ = input$.filter(n => n == 0);
const zeroesChanged$ = zeroes$.mapTo(2);
const onesChanged$ = ones$.mapTo(3);
const allValues$ = Observable.merge(onesChanged$,zeroesChanged$);
allValues$.subscribe(n => console.log(n));
//Outputs 3,3,2,2
//Expected output 3,2,3,2
편집에서 순서를 유지하려면 : 내가 내 질문에 충분한 특정되지 않았습니다 죄송합니다. 부작용을 드라이버로 구분하는 cycleJS라는 라이브러리를 사용하고 있습니다. 그래서 내가 내주기에서 뭐하는 거지 것은 내가 그것을 위해 테스트를 작성하고 싶어 할 때이
export function socketCycle({ SOCKETIO }) {
const serverConnect$ = SOCKETIO.get('connect').map(serverDidConnect);
const serverDisconnect$ = SOCKETIO.get('disconnect').map(serverDidDisconnect);
const serverFailedToConnect$ = SOCKETIO.get('connect_failed').map(serverFailedToConnect);
return { ACTION: Observable.merge(serverConnect$, serverDisconnect$, serverFailedToConnect$) };
}
지금 내 문제가 발생합니다. 나는 잘못된 문제 (농담을 사용)에서 일한 다음과 함께 시도했다.
const inputConnect$ = Observable.from(['connect', 'disconnect', 'connect', 'disconnect']).share();
const expectedOutput$ = Observable.from([
serverDidConnect(),
serverDidDisconnect(),
serverDidConnect(),
serverDidDisconnect(),
]);
const socketIOMock = {
get: (evt) => {
if (evt === 'connect') {
return inputConnect$.filter(s => s === 'connect');
} else if (evt === 'disconnect') {
return inputConnect$.filter(s => s === 'disconnect');
}
return Observable.empty();
},
};
const { ACTION } = socketCycle({ SOCKETIO: socketIOMock });
Observable.zip(ACTION, expectedOutput$).subscribe(
([output, expectedOutput]) => { expect(output).toEqual(expectedOutput); },
(error) => { expect(true).toBe(false) },
() => { done(); },
);
어쩌면 내가 테스트 할 수있는 또 다른 방법이 있을까? 코드 아래
'input $ .map (n => n + 2)'이며 예상 한 결과를 자세히 살펴야합니다. – cartant
각 Observable에서의 "작업"이 한 번에 하나의 값만을 고려한다면, @cartant는 제안한 것처럼 이것을 필터링, 작업, 병합으로 보지 말고 바로 매핑하는 것으로보아야합니다. 가장 일반적인 경우, 매핑 함수는 if-else를 사용하여 값을 다른 동작으로 지정합니다. Observables가 반환되면 [concatMap] (https://www.learnrxjs.io/operators/transformation/concatmap.html)을 통해 주문을 보존 할 수 있습니다. – concat
실제로 맵을 분리하고 소스와 리턴 싱크를 취하는 다른 함수를 병합했습니다. 입력이 비동기 적으로 발생하면 잘 작동하지만 테스트를 시도 할 때 미리 입력이 지정되어있는 곳에서 주문 보존 ... – user1898027