2016-11-09 118 views
0

我正在嘗試在Angular2中進行文件上傳。我使用我在這裏找到的代碼 - https://plnkr.co/edit/ozZqbxIorjQW15BrDFrg?p=info如何從XHR創建Observable

我需要在我的史詩(Angular2 +終極版)使用的反應,所以我想這樣做:

updateAvatarRequest = (action$: ActionsObservable<IPayloadAction>) => { 
    return action$.ofType(MeActions.UPDATE_AVATAR) 
     .mergeMap<IPayloadAction>(({payload}) => { 
     return this.meService.updateAvatar() 
      .map(result => ({ 
      // ACTION ON SUCCESS 
      })) 
      .catch(error => Observable.of({ 
      // ACTION ON ERROR 
      })); 
     }); 
} 

的問題是,我沒有從我的可觀測到我不要任何迴應不贊成。另一個問題是我無法在這個可觀察值上使用catch()。它適用,如果我這樣做:

this.meService.updateUserAvatar(formData) 
    .subscribe(
     (x) => console.log('onNext: %s', x), 
     (e) => console.log('onError: %s', e), 
    () => console.log('onCompleted') 
); 

但我想要一致。請幫助我這個RxJS,直到我失去了其餘的頭髮。

回答

2

,直到我不同意它

這是由設計,我不從我可觀察到任何迴應。我想action$.ofType(MeActions.UPDATE_AVATAR)返回一個冷的Observable,所以它不會被觸發,直到至少有一個用戶。您可以使用publish()將其變成ConnectableObservable,並立即呼叫connect(),這使其成爲熱點Observable(https://jsbin.com/faquhew/5/edit?js,console),但我認爲最好使用默認功能。

欲瞭解更多信息,請參閱:

操作catch()讓我們在繼續鏈從回調中返回Observable,請參閱:https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/catch.md

因此,這取決於您想用catch()實現的目標。

編輯:

var source = Observable.create(obs => { 
    obs.next(1); 
    obs.next(2); 
    obs.error(new Error('original error message')); 
    }) 
    .catch(error => Observable.of('recovered from error')); 

source.subscribe(val => console.log(val)); 

這將打印到控制檯:

1 
2 
"recovered from error" 

見現場演示:https://jsbin.com/micebeg/4/edit?js,console

+0

我需要,如果我想使用捕捉運營商拋出一個錯誤?你能提供一個捕捉用法的例子嗎?在此先感謝:) – Zacol

+0

@Zacol運算符'catch()'只處理錯誤。它沒有其他目的,請參閱我的更新。 – martin

相關問題