Наблюдаемый завершенный не вызывается, когда api возвращает 404, какие-либо альтернативные решения при сбое api? - PullRequest
2 голосов
/ 07 августа 2020
  onSave(payload) {
this.loading = true;
const addIdp = this.identityProviderService.save(payload);
this.autoUnsubscribe(addIdp.subscribe((data) => {
  this.notificationsService.success(this.translateService.instant('idp.form.add-success'), '');
  this.ref.close(data);
}, (error) => {
  this.notificationsService.error(this.translateService.instant('idp.form.add-error'), '');
}, () => {
  this.loading = false;
}));

}

вызов identityProviderService.save содержит httpClient

Ответы [ 3 ]

2 голосов
/ 07 августа 2020

внутри вашего блока ошибок проверьте статус ошибки:

(error) => {
    if (error.status === 404) {
        // custom code goes here
    }
  this.notificationsService.error(this.translateService.instant('idp.form.add-error'), '');
}

Это должно сработать !!!

1 голос
/ 07 августа 2020

Наблюдаемые объекты по своей природе не запускают уведомление complete в случае уведомления error. Они являются взаимоисключающими, то есть, если поток выходит из строя, он не может впоследствии complete или next. И если поток завершится, он не сможет error или next после этого.

Таким образом, вам нужно обработать ошибку либо с помощью блока оператора catchError, либо в блоке обратного вызова error.

Попробуйте следующее

onSave(payload) {
  this.loading = true;
  const addIdp = this.identityProviderService.save(payload);
  this.autoUnsubscribe(addIdp.subscribe(
    (data) => {
      this.loading = false;             // <-- set variable here
      this.notificationsService.success(this.translateService.instant('idp.form.add-success'), '');
      this.ref.close(data);
    }, 
    (error) => {
      this.loading = false;             // <-- and here
      this.notificationsService.error(this.translateService.instant('idp.form.add-error'), '');
    }
  );
}

Или вы можете использовать оператор finalize. Из документации

[it] вызовет указанную функцию, когда исходный код завершится после завершения или ошибки.

onSave(payload) {
  this.loading = true;
  const addIdp = this.identityProviderService.save(payload).pipe(
    finalize(() => this.loading = false)                   // <-- set variable here
  );
  this.autoUnsubscribe(addIdp.subscribe(
    (data) => {
      this.notificationsService.success(this.translateService.instant('idp.form.add-success'), '');
      this.ref.close(data);
    }, 
    (error) => {
      this.notificationsService.error(this.translateService.instant('idp.form.add-error'), '');
    }
  );
}
0 голосов
/ 07 августа 2020

Вы должны наконец позвонить перед подпиской, например:

addIdp
  .finally(() => this.loading = false) // <<-- Call it here
  .subscribe((data) => {
    this.notificationsService.success(this.translateService.instant('idp.form.add-success'), '');
    this.ref.close(data);
  }, (error) => {
    this.notificationsService.error(this.translateService.instant('idp.form.add-error'), '');
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...