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可观察示例如下: