Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角度可观测订阅在next()和error()上调用相同的方法_Angular_Observable - Fatal编程技术网

Angular 角度可观测订阅在next()和error()上调用相同的方法

Angular 角度可观测订阅在next()和error()上调用相同的方法,angular,observable,Angular,Observable,我有一个函数,返回可观察的,我需要重定向到主页,无论这个可观察的返回数据或错误。诸如此类: private initializeCurrentUser() { this.userService .initializeCurrentUser() .subscribe( () => this.router.navigate(['']), //next () => this.router.navigate(['']) /

我有一个函数,返回可观察的,我需要重定向到主页,无论这个可观察的返回数据或错误。诸如此类:

  private initializeCurrentUser() {
    this.userService
      .initializeCurrentUser()
      .subscribe(
        () => this.router.navigate(['']), //next
        () => this.router.navigate([''])  //error
      );
  }

有没有办法泛化next()和error()调用以防止代码重复?

您可以使用
catchError
运算符。运算符处理可观察序列中的错误,并返回可观察,因此在subscribe中,您只能获得下一个值

例如:

private initializeCurrentUser() {
 this.userService
  .initializeCurrentUser()
  .pipe(catchError(() => of()))
  .subscribe(() => this.router.navigate(['']));
}

您可以使用
finalize
操作符:

private initializeCurrentUser() {
 this.userService
  .initializeCurrentUser()
  .pipe(finalize(() => this.router.navigate([''])))
  .subscribe(() => {});
}

我相信答案是否定的,你不能概括
next
error
,因为
subscribe
希望每个人都能收到回调。有几个选项,但我认为它们更多的是代码,而不是清晰的。让我们看看其中一个,看看原因

可观察。subscribe
可以用两种不同的方式调用。一种方法是像上面那样传递
next
error
complete
的回调。另一种方法是将
观察者
对象传递给它。此
Observer
对象将允许您执行类似于您所要求的操作

让我们创建一个
Observer
,它有一个处理重定向的
next
方法和一个只调用
next
error
方法

const重定向观察者={
下一个(){
this.router.navigate([“”])
},
错误(){
这个。下一个()
}
};
现在我们可以在您的原始示例中使用它,将其传递给
Observable.subscribe()

private initializeCurrentUser(){
这个是.userService
.initializeCurrentUser()
.订阅(观察员);
}
这会有用的!当可观察的
发出错误时,将触发对路由器导航方法的调用。我反对这一观点的理由是,通常
next
error
是不同的,这种方法隐藏了我们正在打破惯例的事实。即使我们真的想以同样的方式处理它们,我们也可以非常明确地表达出来

把重复的逻辑拉出来给助手方法怎么样?这与您想要做的事情具有相同的结果,并且允许代码和意图变得清晰

private重定向到主页(){
这个.router.navigate(['']);
}
私有初始化currentuser(){
这个是.userService
.initializeCurrentUser()
.订阅(
()=>this.redirectToHomepage(),//下一步
()=>this.redirectToHomepage()//错误
);
}
现在,如果您想更改重定向的位置或添加其他逻辑,它将仅位于一个位置,
redirectToHomepage
的定义,而不是在
next
error
中。我们前面的示例也有这样的好处,但现在我们非常明确,很容易看出,当触发
next
error
时,我们期望出现相同的行为

RXJS可观察示例如下: