Вы можете прочитать исходный код здесь:
HttpClient
: https://github.com/angular/angular/blob/master/packages/common/http/src/client.ts
HttpXhrBackend
: https://github.com/angular/angular/blob/master/packages/common/http/src/xhr.ts
Проще говоря, шаблон всех HTTP-запросов через HttpClient
выглядит следующим образом:
of(request).pipe(
concactMap(request => this.xhr.handle(request))
);
Где request
- абстракция HTTP-запрос, а this.xhr
- это обертка вокруг javascript XHR - реализованная HttpXhrBackend
.
of(request)
возвращает самодостаточную наблюдаемую, поэтому не о чем беспокоиться.
HttpXhrBackend.handle()
выполняет запрос, используя собственные методы XHR. Основные строки кода в исходном коде:
if (ok) {
// A successful response is delivered on the event stream.
observer.next(new HttpResponse({
body,
headers,
status,
statusText,
url: url || undefined,
}));
// The full body has been received and delivered, no further events
// are possible. This request is complete.
observer.complete();
} else {
// An unsuccessful request is delivered on the error channel.
observer.error(new HttpErrorResponse({
// The error in this case is the response body (error from the server).
error: body,
headers,
status,
statusText,
url: url || undefined,
}));
}
Здесь мы видим, что наблюдаемое либо завершается, либо ошибается - два способа, которыми наблюдаемое может решить свою собственную судьбу.
Заключение
Все, что все говорят о том, что не нужно отписываться от http-запросов, является правдой - вы можете безопасно подписаться и забыть.
Это неправда, что запрос через HttpClient
будет получать только один результат, так как Вы можете наблюдать за другими событиями, кроме ответа.