2017-12-05 6 views
0

각도와 Rx를 처음 접한다면 이걸 조금 이해하려고합니다 ... 내 앱이 UI 이벤트에 반응하여 Observable을 반환하는 HTTP 서비스를 호출하게됩니다. switchmap과 다른 관찰 가능

this.myXYZService.search(query) 
    .map(r => { // some code }) 
    .subscribe(r => { //some code }); 

해당 이벤트가 다시 트리거 말과는 첫번째 호출 완료되기 전에 관찰 가능한 새로운 브랜드를 반환합니다 같은 HTTP 서비스에 두 번째 호출을 만드는 결과 : 그래서처럼 가입.

이제 내가 이해 한대로 map 대신 switchMap을 사용하여 이전 Observable을 삭제하고 새로운 Observable에서 작동 할 수 있습니까? 아니면 이것을 잘못 이해하고 있습니까? 첫 번째 이벤트가 이미 체인의 가입 부분에있는 경우 두 번째 이벤트가 트리거되면 어떻게됩니까? 이 경우 더 이상 전환하지 않습니다. 그리고 JS가 동기 적이기 때문에 2 차 이벤트가 체인 처리를 시작하기 전에 전체 1 차 체인이 실행되지 않을까요?

Observables의 인스턴스가 다르기 때문에 나는 혼란스러워합니다. Rx가 전환 호출을 어떻게 추적합니까? 함수 이름에 의한 것입니까? 두 개의 코드 블록이 있다고 가정 해보십시오.

this.myXYZService.search('abcd') 
    .map(r => { // some code }) 
    .subscribe(r => { //some code }); 

this.myXYZService.search('efgh') 
    .map(r => { // some code }) 
    .subscribe(r => { //some code }); 

위에서 switchMap을 정확히 사용하면 어떻게됩니까? 두 번째 전화가 첫 번째 전화를 취소합니까?

답변

1

switchMap은 외부 관찰 가능 항목이 방출 될 때 이전의 내부 관찰 가능을 취소합니다. 이 경우

Observable.fromEvent(inputEl, 'keydown') // outer observable 
    .switchMap(event => { 
     let value = event.value; 

     return this.myXYZService.search(value); // inner observable 
    }) 
    .subscribe(res => { 
     // some code 
    }); 

들어마다 (입력 요소를 keyDown)에 외 관측 (fromEvent)을 방출 내부 관찰 (myXYZService.search)가 호출되고 이전 내부 관찰이 취소된다.

2

당신은 즉시 새로운 검색 용어가 다음 검색 호출이 무시됩니다 진행중인 모든/폐기 도착하는대로 ... 같은

searchTerms.switchMap( searchTerm => this.myXYZService.search(searchTerm) ).subscribe(...)

뭔가를 원하는 것입니다. 외침이 아직도 나가기 때문에 나는 취소 한 낱말을 사용하지 않을 것입니다. 그러나 그 결과는 무시됩니다.

두 번째 검색어가 출력되기 전에 첫 번째 요청이 반환되면 구독으로 전송됩니다. 그렇지 않으면 그렇지 않을 것입니다.

+0

'취소됨'이라는 문안이 좋습니다. 네트워크 탭에 취소라고 표시되어 사람들이 종종이 용어를 사용한다고 생각합니다. 실제로 전화가 계속 울리면 클라이언트는 청취를 멈 춥니 다. – LLai

+0

감사합니다. 따라서이 경우 searchTerms는 바깥 관찰 가능에있게됩니다. – SBKDeveloper

+0

@ 엘리제 여기 switchMap과 flatMap, concatMap에 대한 좋은 [article] (https://tolikcode.github.io/post/rxjsMap/)입니다. 기술적으로 이들 모두는 관측 대상을 연속적으로 연결하는 데 사용할 수 있습니다. 그러나 내부 관측 가능은 조작자에 따라 다르게 반응합니다. switchMap을 사용하면 이전의 내부 관찰 가능 항목은 외부 관찰 항목이 방출 될 때 삭제됩니다. 그래서 어떤면에서 새로운 것을 만들 때 내부 관측 가능 (Outer Observable이 방출 할 때)을 "전환"하고 있습니다. – LLai

관련 문제