how to use switchMap to cancel pending http requests and taking the last subscribe only?

后端 未结 3 1546
礼貌的吻别
礼貌的吻别 2021-01-19 05:11

i tried canceling pending http request using subscription.unsubsribe like this:

getAgentList(pageNumber: number, filter: string): any {
   let requestUrl: s         


        
相关标签:
3条回答
  • 2021-01-19 05:18

    tried and it even did not got out to the server

    getAgentList(pageNumber: number, filter: string): any {
        let requestUrl: string = 'api/service/agents_search?ACCT=' 
      +this.accountId;
        if (filter) {
            requestUrl = requestUrl + '&filter=' + filter;
        }
        if (pageNumber) {
            requestUrl = requestUrl + '&pageNumber=' + pageNumber;
        }
        this.$filter.next(requestUrl)
    
        this.$filter.switchMap(requestUrl => 
        this.backEndCommService.getData(requestUrl))
                .subscribe(
                    (res: any) => {
                        let serverResponse: ServerResponse = new 
                        ServerResponse(this.accountId, pageNumber, 
                        res.search_results, 
                        res.resultRows, res.pageSize, res.resultPages)
                        this._agentListData$.next(serverResponse);
                    },
                   (err: HttpErrorResponse) => {
    
                console.log('handling error');
          });
    }
    

    this line switchMap(requestUrl => this.backEndCommService.getData(requestUrl)) did not made the call and fall silently.....mmmm

    0 讨论(0)
  • 2021-01-19 05:29

    Looks like the problem is that the subscription is done after the next. Think of it like addEventListener on the DOM. You receive events after you add the listener, or in this case, the subscriber.

    getAgentList(pageNumber: number, filter: string): any {
        let requestUrl: string = ‘...’
    
        // assuming this.$filter is a Subject
        // subscription to it first
        this.$filter.switchMap(requestUrl => this.backEndCommService.getData(requestUrl))
            .subscribe(
                (res: any) => {
                    let serverResponse: ServerResponse = new 
                    ServerResponse(this.accountId, pageNumber, 
                    res.search_results, 
                    res.resultRows, res.pageSize, res.resultPages)
                    this._agentListData$.next(serverResponse);
                },
               (err: HttpErrorResponse) => {
                    console.log('handling error')
               }
        );
    
        // then call next()
        this.$filter.next(requestUrl)
    }
    

    That’s probably it. Unless, this.$filter is a BehaviorSubject or ReplaySubject, then we may have a different problem.

    0 讨论(0)
  • 2021-01-19 05:41

    basic example:

    export class MyComponent{
        private $filter: Subject<string> = new Subject<String>();
    
        constructor(){
            this.$filter
              .switchMap(filter => this.backEndCommService.getData(filter + this.baseUrl)
              .subscribe(res => {//do something})
        }
    
        getAgentList(filterValue: string){
            this.$filter.next(filterValue);
        }
    
    }
    

    To use switchmap to cancel previous request we need a hot observable which outputs our filter value. We use a subject for that. Everytime we get a new value from somewhere? we push it to the subject.

    0 讨论(0)
提交回复
热议问题