【发布时间】:2018-01-17 03:11:45
【问题描述】:
我有这个功能:
/**
* Attempt login with provided credentials
* @returns {Observable<number>} the status code of HTTP response
*/
login(username: string, password: string): Observable<number> {
let body = new URLSearchParams();
body.append('grant_type', 'password');
body.append('username', username);
body.append('password', password);
return this.http.post(Constants.LOGIN_URL, body, null)
.do(res => {
if (res.status == 200) {
this.authTokenService.setAuthToken(res.json().auth_token);
}
})
.map(res => res.status)
.catch(err => { return Observable.throw(err.status) });
}
此函数尝试执行登录并返回Observable<number>,调用者可以使用该Observable<number> 来通知响应的HTTP 代码。
这似乎可行,但我有一个问题:如果调用者只是调用函数而不订阅返回的Observable,则不会调用do 函数并且不会保存接收到的身份验证令牌。
do 状态的文档:
注意:这与订阅 Observable 不同。如果 do 返回的 Observable 未订阅,副作用 观察者指定的将永远不会发生。因此只是做间谍 在现有执行中,它不会触发执行 订阅即可。
我想要实现的是,无论login() 的调用者是否订阅,都会产生这种副作用。我该怎么办?
【问题讨论】:
-
这个方法返回一个 observable。如果您不打算订阅它的响应,那么调用它有什么意义? (如果您不订阅,您将不会提出此请求)
-
@echonax,此方法正在使用中。可能有多个客户——其中一些会订阅,而另一些则不会。我不希望服务的功能依赖于外部使用的语义。
-
你可以在
login()方法中调用subscribe()
标签: angular typescript rxjs