我有這樣的功能:角:有副作用並從方法返回可觀察
/**
* 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>
調用方可以使用以便被通知的HTTP代碼的響應。
這似乎工作,但我有一個問題:如果調用者只是調用該函數而不訂閱返回的Observable
,do
函數未被調用,並且收到的授權令牌未被保存。
的do
狀態文檔:
注:這是不同的可觀測訂閱。如果由do返回的Observable未訂閱,Observer指定的副作用 將不會發生。因此,只是在現有的執行間諜 ,它不會觸發執行發生像訂閱 那樣。
我想實現的是,無論login()
的調用者是否訂閱,都會產生這種副作用。我該怎麼辦?
此方法返回可觀察值。如果你不打算訂閱它的迴應,那麼調用它有什麼意義? (如果您不訂閱,您不會提出此請求) – echonax
@echonax,此方法正在使用中。可能有多個客戶 - 其中一些客戶會訂閱,其他客戶則不會。我不希望服務的功能依賴於外部使用的語義。 – Vasiliy
你可以在'login()'方法內調用'subscribe()'方法 – martin