Угловое использование наблюдаемого завершения против следующего обработчика и когда использовать каждый соответствующим образом - PullRequest
3 голосов
/ 01 октября 2019

Вопрос - на основе Angular doc , когда более уместно использовать next vs complete для моей наблюдаемой?

Я просматриваю чей-то проект Angular 7 и вижумного кода, который выглядит следующим образом, где некоторые вызовы используют next, а некоторые просто завершены, и я пытаюсь узнать, когда использовать соответствующий, основанный на Angular doc , потому что next является 'required' изавершено является «необязательным».

login() {
  this.authService.login(this.model).subscribe(next => {
    this.alertService.success('Logged in successfully');
  }, error => {
    this.alertService.danger(error);
  }, () => {
    this.router.navigate(['/home']);
  });
}

register() {
  this.authService.register(this.user).subscribe(() => {
      this.showRegistrationComplete = true;
    }, error => {
      // handle the error code here
    }
  );
}

Где в некоторых случаях я вижу «next», а в некоторых случаях «()» завершается для подписки.

Оба эти 2 вызова вышевызовите их ниже (отправьте методы в контроллер)

login(model: any) {
    return this.http.post(this.baseUrl + 'login', model).pipe(
      map((response: any) => {
        const user = response;
        if (user) {
          // do some stuff
        }
      })
    );
  }

  register(model: any) {
    return this.http.post(this.baseUrl + 'register', model);
  }

Что произойдет, если у меня будет это ниже - это означает «завершено» или это означает «следующий», потому что это первый параметр в подписке?

this.authService.login(this.model).subscribe(() => {
      this.alertService.success('Logged in successfully');
      this.router.navigate(['/home']);
    }, error => {
      this.alertService.danger(error);
    });

1 Ответ

1 голос
/ 01 октября 2019

Из документации RxJS :

Подписка на Observable похожа на вызов функции, обеспечивающей обратные вызовы, куда данные будут доставлены.

Наблюдаемый может отправлять три типа уведомлений: Next, Error, Complete.

  • Next уведомление отправляет значение, такое как Число , Строка , Объект и т. д.

  • Error Уведомление отправляет JavaScript Ошибка или исключение.

  • Complete уведомление не отправляет значение.

И в методе subscribe() мы предоставляем три обратных вызова для получения этих трех типов уведомлений. Порядок обратных вызовов имеет значение, они соответствуют Next, Error и Complete по порядку.

В приведенном ниже коде параметр next в первом обратном вызове может быть назван как угодно, егоимя не имеет никакого значения.

this.authService.login(this.model).subscribe(next => {
  this.alertService.success('Logged in successfully');
});

Когда в первом обратном вызове нет параметров, мы не собираем значения, отправленные из наблюдаемой. Мы можем игнорировать наличие параметра, когда нам важно знать, что значение отправлено, но не заботиться о фактическом отправленном значении.

this.authService.login(this.model).subscribe(() => {
      this.alertService.success('Logged in successfully');
      this.router.navigate(['/home']);
    }, error => {
      this.alertService.danger(error);
    });

В приведенном выше фрагменте кода мы не получим значенияотправлено, но оповещение срабатывает при отправке значения. Здесь у нас нет третьего обратного вызова, поэтому мы не будем уведомлены, когда наблюдаемое завершится.

Когда более уместно использовать следующий против завершения для моей наблюдаемой?

  • Используйте первый обратный вызов для получения значений из наблюдаемой.

  • Используйте второй обратный вызов для обработки любых ошибок.

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

Также обратите внимание, что уведомления Error и Complete могут появляться только один раз во время наблюдаемого выполнения, и могуттолько будь одним из них. Поэтому при возникновении ошибки третий обратный вызов не будет вызван.

...