How can I implement timeout for angular2+ http request

前端 未结 4 1548
迷失自我
迷失自我 2020-12-01 18:22

Here is just regular request looking like that:

this.people = http.get(\'http://localhost:3000/users\')
                  .map(response => response.json()         


        
相关标签:
4条回答
  • 2020-12-01 18:31

    You can leverage the timeout operator of observables, as described below:

    return this.http.get('http://api.geonames.org/postalCodeSearchJSON',
              { search: params })
        .retryWhen(error => error.delay(500))
        .timeout(2000, new Error('delay exceeded')) // <------
        .map(res => res.json().postalCodes);
    
    0 讨论(0)
  • 2020-12-01 18:34

    The return value of http.get() is an observable, not the response. You can use it like:

    getPeople() {
      return http.get('http://localhost:3000/users')
          .timeout(2000)
          .map(response => response.json());
      }
    }
    
    foo() {
      this.subscription = getPeople.subscribe(data => this.people = data)
    }
    
    // to cancel manually
    cancel() {
      this.subscription.unsubscribe();
    }
    

    See also https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/timeout.md

    0 讨论(0)
  • 2020-12-01 18:41

    As with the new version, you must pipe to use the timeout. And to get the response you can use map inside. The complete code is as below.

    import { map, timeout, catchError } from 'rxjs/operators';

    const sub: any = this.httpClient.post(this.baseUrl, body)
        .pipe(timeout(Config.SesamTimeout),
            catchError((err: any) => {
                this.handleTimeout(err);
                return of(null);
            }),
            map((v: SesamResponse) => {
                if (v) {
                    const a: SearchResultGroup[] = this.convertSesamResponseToApiFileItem(v);
                    return a;
                }
            }));
    

    Here Config.SesamTimeout is the time in milliseconds.

    0 讨论(0)
  • 2020-12-01 18:49

    If you are using RxJS version 6 and above the current syntax is this:

    import { timeout } from 'rxjs/operators';

    getPeople(){
      return this.http.get(API_URL)
      .pipe(
          timeout(5000) //5 seconds
      );
    
    0 讨论(0)
提交回复
热议问题