2017-04-11 5 views
1

Reactive Programming을 학습하면서 RxJs을 사용하여이 상황에 가장 적합한 연산자를 찾는 데 도움이 필요합니다. 임은 angular 4 응용 프로그램을 개발하고이 방법이 있습니다배열에서 중복 된 객체를 연결하지 못하도록하는 방법은 무엇입니까?

ngAfterViewInit() { 
    this.returnUsers(); 
    } 

    returnUsers() : void { 
    this.userService.ListUsers(this.token) 
     .subscribe(response => { 
      this.token = response.token; 
      this.users = this.users.concat(response.users); 
     }); 
    } 

    scrollDown() { 
    this.returnUsers(); 
    } 

기능은 괜찮습니다, 문제는 사용자의 스크롤이 너무 빠른 경우, 내가 서버에 전송 토큰이 같은, 그래서 내가 중복 CONCAT이다 객체. 나는 그것을 다루는 최선의 방법이 무엇인지 알고 싶다. .filter 연산자로 시도했지만 반복되지 않는 객체 만 연결했지만 여전히 서버에 도달했습니다.

편집 : 당신은 모든 스크롤 이벤트에 scrollDown() 메소드를 호출하는 angular2-infinite-scroll

+0

distinctUntilChanged를 시도하셨습니까? – ABOS

+0

지금 시도한 다음 10ms로 스로틀 시간 (내가 사용하는 스크롤 구성 요소의 템플리트에서)을 변경하고 여러 번 반복 요청을 서버에 작성합니다. – gog

답변

1

를 사용 임?

그렇다면 원하는 모든 스크롤 이벤트에 대해 새 구독을 만들고있는 것입니다.
Subject 인스턴스를 사용하고 모든 스크롤 이벤트에 값을 입력해야한다고 생각합니다. 그런 다음 debounceTime(100)을 사용하여 너무 빨리 도착한 방출을 폐기하고 단일 가입을 할 수 있습니다.

이와 비슷한 것 (분명히이 코드를 테스트하지는 않았지만 요점을 얻을 수 있기를 바랍니다).

private subject$ = new Subject(); 

constructor() { 
    this.subject$ 
     .debounceTime(100) 
     .concatMap(() => this.userService.ListUsers(this.token)) 
     .subscribe(response => { 
      this.token = response.token; 
      this.users = this.users.concat(response.users); 
     }); 
    }); 
} 

scrollDown() { 
    this.subject$.next(); 
} 
+0

그것은 마틴 근무했습니다. 난 그냥 왜'this.subject $ .next();'첫 번째 결과를 얻으려면 구독 줄 뒤에 생성자에 넣어해야 할 이유가 없어. 생성자에서 subscribe 메서드를 호출하면 이미 그렇게해야합니까? – gog

+0

@ggui'this.subject $ .next();'는 생성자가 아니라'scrollDown()'메소드 안에 있습니다. – martin