Observable Typescript中的使用模式

Observable <void> Typescript中的使用模式

问题描述:

当异步服务没有返回值但我想使用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

有可预见的问题,只是要更精确,当你定义一个泛型类型主题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