Всегда ли http-операции httpClient наблюдаются с одним значением? Могут ли они как-то испустить больше, чем одно значение? - PullRequest
2 голосов
/ 29 февраля 2020

Мне трудно понять, как работает http Observables.

Http get всегда завершается, когда приходит только одно значение, но нет способа найти реализацию. Всегда ли они завершаются после ошибки или получения значения?

У меня много обсуждений с моими коллегами, потому что в каждой операции http используется следующая процедура:


const sub = this.http.get( enviroment.baseUrl + '/users').pipe(take(1))
                                             .subscribe( value => {
                                              //do something with the value
                                               },
                                              error => consol.log(error.message));

И позже это :

ngOndestroy():void{
    sub.unsubscribe();
}

И, насколько я понимаю, pipe(take(1)) не нужен, поскольку вызов http всегда выдает одно значение.

Ответ или ошибка.

И поскольку наблюдаемое завершается одним значением, отписываться не нужно.

пожалуйста, поправьте меня, если я беспокоюсь. Я также был бы рад иметь официальные источники по этому вопросу, если вы имеете в виду.

Большое спасибо заранее

1 Ответ

5 голосов
/ 29 февраля 2020

Вы можете прочитать исходный код здесь:

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 будет получать только один результат, так как Вы можете наблюдать за другими событиями, кроме ответа.

...