Когда оператор timeout
следует за оператором map
, значение, возвращаемое из обратного вызова оператору map
, важно, поскольку оно определяет, какое значение передается логике timeout
.Поскольку в вашей операции map
нет возвращаемого значения, то оператору timeout
передается undefined
, когда он оценивает наблюдаемое излучение из источника (HTTP get
).
Поскольку наблюдаемоеundefined
никогда не завершается, тогда оператор timeout
всегда выдаст ошибку (по истечении указанного времени).
Вместо использования map
для побочного эффекта установки значения в локальном хранилище,используйте tap
, который просто переправит наблюдаемый источник на следующий оператор в трубе.
const endpoint = rxjs.of('blah');
function getRequest(httpObservable, name) {
return endpoint.pipe(
rxjs.operators.switchMap(() => httpObservable),
rxjs.operators.tap((val) => { // Call `tap` instead of `map`
console.log(`${name}: ${val}`);
}),
rxjs.operators.timeout(2000),
rxjs.operators.map(() => true),
).subscribe(
null,
() => console.log(`${name} Errored!`),
() => console.log(`${name} Complete!`)
);
}
const http = rxjs.timer(500);
const slowHttp = rxjs.timer(4000);
getRequest(http, 'Quick HTTP');
getRequest(slowHttp, 'Slow HTTP');
<script src="https://unpkg.com/@reactivex/rxjs@6.5.2/dist/global/rxjs.umd.js"></script>