2017-09-08 32 views
1

我有一個問題,當我試圖建立終極版在我Angular4項目中,我使用的代碼下面的管理登錄操作:RXJS抓住運營商沒有趕上錯誤

@Effect() 
    login$: Observable<Action> = this.act 
    .ofType(actions.LOGIN) 
    .map((action: actions.LoginAction) => action.payload) 
    .switchMap((val: { email: string, password: string }) => this.authService.login(val.email, val.password) 
     .map(auth => new actions.LoginSuccessAction(auth)) 
     .catch(err => of(new actions.LoginFailAction(err)))); 

enter image description here

由於某種原因,Webstorm不承認rxjs「map」運算符,但在編譯時運行良好。

而且authService裏面我定義的模擬日誌中檢查:

login(email: string, password: string): Observable<any> { 
    if (email == '[email protected]') { 
     return Observable.of('Login Success'); 
    } 
    throw(new Error('Username or password incorrect')); 
    } 

如果電子郵件是[email protected]一切工作正常,Redux的狀態變化但是如果登錄失敗,我的「捕獲」操作出於某種原因不捕獲錯誤,而不是在控制檯中出現錯誤如下enter image description here

在我的核心模塊的文件夾我導入模塊如下:

import 'rxjs/add/operator/catch'; 

任何人都知道這裏發生了什麼?

感謝

+0

不要拋出'new Error'只嘗試'throw false'或任何適合的值。這應該被捕獲者捕獲。 – David

+0

@David拋出'false'將沒有任何區別。下面的答案中描述了實際問題。 – cartant

回答

1

的問題是,在login方法錯誤在您的效果組成的可觀測鏈的外甩。

也就是說,引發錯誤而不是返回一個可觀察值 - 運算符將鏈接到該可觀察值。所以它不能被catch捕獲。

相反,你可以返回與Observable.throw創建一個可觀察:

import 'rxjs/add/observable/throw'; 

login(email: string, password: string): Observable<any> { 
    if (email == '[email protected]') { 
    return Observable.of('Login Success'); 
    } 
    return Observable.throw(new Error('Username or password incorrect')); 
} 

這樣做會返回一個可觀察到的,這將在訂閱引發錯誤通知。那個錯誤將會被你的catch所捕獲。

+0

是的,我認爲你是對的,我發現解決問題的方式是使用return ErrorObservable.create(Error('Username or password incorrect'))。然後錯誤被成功捕獲〜謝謝! –