【发布时间】:2018-08-28 09:11:19
【问题描述】:
我有一个发出 Either = Success | Failure 的 Observable:
import { Observable } from 'rxjs';
type Success = { type: 'success' };
type Failure = { type: 'failure' };
type Either = Success | Failure;
const either$ = new Observable<Either>(observer => {
console.log('subscribe');
observer.next({ type: 'failure' });
observer.complete();
return () => {
console.log('unsubscribe');
};
});
我想让用户在 Observable 完成并且最后一个值为 Failure 时“重试”observable。
(retry{,When} 运算符在这里没有帮助,因为它们在 error 频道上处理错误。因此,我认为我们应该改为考虑 repeat。)
我想:
- 重复 Observable
n次,直到最后一个值不是Failure。 - 然后,允许用户手动重复。当重复通知 observable (
repeat$) 发出时,再次重复 observable。
例如:
// subscribe
// next { type: 'failure' }
// unsubscribe
// retry 2 times:
// subscribe
// next { type: 'failure' }
// unsubscribe
// subscribe
// next { type: 'failure' }
// unsubscribe
// now, wait for repeat notifications…
// on retry notification:
// subscribe
// next { type: 'failure' }
// unsubscribe
【问题讨论】:
-
我认为其中的主要缺陷是您想手动重复该链,因为一个
subscribe()基本上意味着您将拥有一个订阅。如果您允许用户手动重试,那么您将拥有一个包含多个订阅的链,这不是您通常想要实现的。我认为使用window运算符可以工作,但我建议在每个repeat$上调用新的subscribe -
我的函数需要返回一个
Observable,并且订阅是在我的控制之外创建的。
标签: rxjs observable repeat