使用可观察的完整vs下一个处理程序以及何时适当使用每个角度的角度

时间:2019-10-01 15:37:48

标签: javascript angular typescript rxjs angular-observable

问题-基于Angular doc,对于我的观察对象,何时使用next和complete更合适?

我正在浏览某人的Angular 7项目,下面看到很多代码,其中一些调用使用next,有些仅使用complete,而我试图根据何时使用适当的代码。 Angular doc,因为下一个是“必填”,而完成是“可选”。

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

在某些情况下,我看到“下一个”,而在某些情况下,我看到了“()”完成了订阅。

以上两个调用都在下面调用(将方法发布到控制器)

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 个答案:

答案 0 :(得分:1)

来自RxJS documentation

  

订阅一个Observable就像调用一个函数,提供   数据将传递到的回调。

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

  • Next通知发送诸如 Number String Object 等值。< / p>

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

  • Complete通知未发送值。

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

在下面的代码中,第一个回调中的参数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);
    });

在上面的代码段中,我们将不会收到发送的值,但是每发送一个值都会触发警报。这里我们没有第三个回调,因此当可观察对象完成时我们不会收到通知。

在我的观察范围内,何时使用next和complete更合适?

  • 使用第一个回调从可观察对象接收值。

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

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

还请注意,ErrorComplete通知在可观察的执行期间只能发生一次,并且只能有一个。因此,当发生错误时,将不会调用第三个回调。