Как я могу реализовать тайм-аут для запроса angular2+ http

Вот обычный запрос:

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

Есть ли способ отложить/перевести это?

Ответ 1

Вы можете использовать оператор наблюдаемых 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);

Более подробную информацию см. в этой статье (в разделе "Поддержка повтора" ):

Ответ 2

Возвращаемое значение 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

Ответ 3

Если вы используете RxJS версии 6 и выше, текущий синтаксис следующий:

import {timeout} из 'rxjs/operator';

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

Ответ 4

Как и в новой версии, вы должны 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 - время в миллисекундах.