Angular 使用 observable complete 与 next 处理程序以及何时适当地使用每个处理程序

Angular using the observable complete vs next handler and when to use each appropriately

问题 - 基于 Angular doc,什么时候对我的 observable 使用 next 和 complete 更合适?

我正在查看某人的 Angular 7 项目,我看到很多代码如下所示,其中一些调用使用 next,一些仅使用 complete,我想知道何时使用合适的是基于 Angular doc,因为 next 是 'required',complete 是 'optional'。

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',在某些情况下,我看到“()”已完成订阅。

上面的这两个调用都在下面调用(post 控制器的方法)

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);
  }

如果我在下面有这个会发生什么 - 这意味着 'complete' 还是意味着 'next' 因为它是订阅中的第一个参数?

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

来自 RxJS documentation:

Subscribing to an Observable is like calling a function, providing callbacks where the data will be delivered to.

一个可观察对象可以发送三种类型的通知:NextErrorComplete

  • Next 通知发送一个值,例如 NumberString对象

  • Error 通知发送 JavaScript 错误或异常。

  • Complete 通知没有发送值。

并且在subscribe()方法中我们提供了三个回调来接收这三种类型的通知。回调的顺序很重要,它们依次对应 NextErrorComplete

在下面的代码中,第一个回调中的参数next可以任意命名,它的名字没有任何意义。

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

当第一个回调中没有参数时,我们不会捕获从 observable 发送的值。当我们只关心知道发送了一个值而不关心发送的实际值时,我们可以忽略参数。

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

在上面的代码片段中,我们不会收到发送的值,但只要发送值就会触发警报。这里我们没有第三个回调,所以当 observable 完成时我们不会收到通知。

我的 Observable 什么时候使用 next 和 complete 更合适?

  • 使用第一个回调从 observable 接收值。

  • 使用第二个回调来处理任何错误。

  • 当可观察对象完成时,使用第三个回调来执行任何任务。

另请注意,ErrorComplete 通知在可观察执行期间可能只发生一次,并且只能有其中之一。所以当出现错误时,不会调用第三个回调。