【发布时间】:2021-06-22 08:57:37
【问题描述】:
我想创建一个运行长轮询操作的rxjs Observable。
每次迭代都会发出中间结果。
当isComplete 返回真时,Observable 完成。
这个函数的行为应该如下
- 只有当有至少一个订阅者时才应该开始
- 应该允许多个订阅者共享结果
- 如果没有没有订阅者离开 ,它应该中止轮询并取消呼叫
以下代码运行正常,满足条件(1)和(2):
function longPollingAction(fetch: () => Promise<Response>, cancel: () => {}): Observable<Response> {
return defer(() => { // defer to start running when there's a single subscriber
return from(fetch()).pipe(
expand(() => timer(1000).pipe(switchMap(fetch))),
takeWhile<Response>(isComplete, false),
);
}).pipe(share()); // share to allow multiple subscribers
}
function isComplete(r: Response): boolean {
// returns true if r is complete.
}
如何修改此代码以满足 (3) 的要求?在当前实现中,轮询停止,但我如何调用cancel?
【问题讨论】:
-
我认为 share 已经有这种行为了?如果没有,请尝试
.pipe(publish(), refCount())。 -
@MrkSef 你是对的。轮询确实会随着当前的实现而停止。我解决了我的问题:当没有订阅者时,我想调用
cancel函数。 -
我在下面添加了一个答案。您应该可以只使用
finalize。
标签: javascript typescript rxjs observable reactivex