我相信答案是否定的,你不能一概而论next 和error 因为subscribe 期待每个回调。有几个选项,但我认为它们的代码更多,不太清楚。让我们看一个,看看为什么。
Observable.subscribe 有两种不同的调用方式。一种是像上面那样传递next、error 和complete 的回调。另一种方法是传递一个Observer 对象。这个Observer 对象可以让你做你所要求的事情。
让我们创建一个Observer,它有一个处理重定向的next 方法和一个只调用next 的error 方法。
const redirectObserver = {
next() {
this.router.navigate([''])
},
error() {
this.next()
}
};
现在我们可以通过将其传递给 Observable.subscribe() 来在您的原始示例中使用它
private initializeCurrentUser() {
this.userService
.initializeCurrentUser()
.subscribe(redirectObserver);
}
这行得通!当Observable 发出或出错时,将触发对路由器的导航方法的调用。我反对这一点的论点是next 和error 通常是不同的,这种方法隐藏了我们正在打破常规。即使我们真的想以同样的方式处理它们,我们也可以非常明确地表达出来。
如果只是将重复的逻辑提取到辅助方法中呢?这与您想要做的结果相同,并且可以清楚地显示代码和意图。
private redirectToHomepage() {
this.router.navigate(['']);
}
private initializeCurrentUser() {
this.userService
.initializeCurrentUser()
.subscribe(
() => this.redirectToHomepage(), //next
() => this.redirectToHomepage() //error
);
}
现在,如果您想更改重定向的位置或添加额外的逻辑,它只会在一个地方,redirectToHomepage 的定义中,而不是在next 和error 中。我们之前的示例也有这个好处,但是现在我们非常明确,很容易看出我们期望在next 或error 被触发时会出现相同的行为。
RXJS 可观察示例在这里:https://rxjs-dev.firebaseapp.com/api/index/class/Observable