Вот обычный запрос:
this.people = http.get('http://localhost:3000/users')
.map(response => response.json());
Есть ли способ отложить/перевести это?
Вот обычный запрос:
this.people = http.get('http://localhost:3000/users')
.map(response => response.json());
Есть ли способ отложить/перевести это?
Вы можете использовать оператор наблюдаемых 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);
Более подробную информацию см. в этой статье (в разделе "Поддержка повтора" ):
Возвращаемое значение 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
Если вы используете RxJS версии 6 и выше, текущий синтаксис следующий:
import {timeout} из 'rxjs/operator';
getPeople(){
return this.http.get(API_URL)
.pipe(
timeout(5000) //5 seconds
);
Как и в новой версии, вы должны 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
- время в миллисекундах.