如何超时angular2 http请求

时间:2016-04-19 12:56:35

标签: http angular

以下是常规请求:

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

有没有办法实现/超时呢?

4 个答案:

答案 0 :(得分:36)

您可以利用observables的timeout运算符,如下所述:

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);

有关详细信息,请参阅此文章(“重试支持”部分):

答案 1 :(得分:9)

http.get()的返回值是可观察的,而不是响应。 您可以像使用它一样使用它:

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();
}

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

答案 2 :(得分:2)

如果您使用的是RxJS版本6及更高版本,则当前语法为:

从'rxjs / operators'导入{超时};

getPeople(){
  return this.http.get(API_URL)
  .pipe(
      timeout(5000) //5 seconds
  );

答案 3 :(得分:0)

与新版本一样,您必须pipe才能使用timeout。要获得响应,您可以在内部使用map。完整的代码如下。

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;
            }
        }));

Config.SesamTimeout是毫秒级的时间。