2017-09-23 171 views
2

當異步服務沒有返回值但我想使用Observables時,我傾向於使用Observable<boolean>。但我對這個布爾值沒有意義,因爲服務失敗或成功,如果失敗,我希望Observable處於錯誤狀態。這隻留下觀察到的布爾值的「真」值。Observable <void> Typescript中的使用模式

Observable<void>下面的使用是否適合這些情況?或與使用的Observable<void>

const asyncFuncWithoutResult =(): Observable<void> => { 
    // fake something async that has no return value 

    const itWorked = true; // or not 
    if (itWorked) { 
    return Observable.of(); 
    } else { 
    return Observable.throw(Error('It did not work')); 
    } 
} 

// call the service 
asyncFuncWithoutResult() 
    .subscribe(
    undefined, // nothing will be emitted when using Observable.of() 
    (err: any) => console.error(err), // handle error state 
    () => console.log('Success'),  // handle success state 
); 
+1

我看不到任何明顯的問題。如果遇到需要發出任意值的情況,則始終可以使用'concat'和'Observable.of'來發出所需的值。例如。 'asyncFuncWithoutResult()。CONCAT(Observable.of( 「成功了!」))'。 – cartant

+0

Thx,這是一個非常有用的提示。 – Halt

回答

1

有可預見的問題,只是要更精確,當你定義一個泛型類型主題void你,只有一個辦法,你可以調用它next()方法,這是不帶任何參數:

const subject = new Subject<void>(); 
subject.next(); 

事實上,value參數next是可選的,所以如果你不指定它,它會發送undefined這意味着,即使你有Subject<void>您仍然會收到next個通知

asyncFuncWithoutResult().subscribe(alawaysUndefined => { 
    /* ... */ 
}); 

另外請注意,你可以將任何可觀察到<void>(當你要合併多個觀測量,這是必要的)通過mapmapTo

source.mapTo(void 0) 
    ... 
+0

感謝您的額外見解,非常有幫助。如果subject.next();導致發送'undefined'是否有意義,類似於這個Observable.of()不會返回帶有'undefined'的Observable? – Halt

+1

我認爲這是兩回事。如Observable.of()'(或'Observable.empty')一樣,Observable不會發出任何'next'並只發送'complete'通知,這是完全正確的。另一方面,讓'subject.next()'不做任何事情是沒有意義的,因爲當你知道它不會做任何事情時調用這個方法的意義何在?出於同樣的原因,沒有Observable不會發出任何'next','complete'或'error'通知,因爲爲什麼有人想要使用它們。 – martin

相關問題