angular - Rxjs 首先轮询对象详细信息,然后根据需要根据对象的状态重复轮询
问题描述
我想知道在 angular RxJS 中执行以下操作的最佳实践。
- 在页面加载时,我需要 http 获取对象的详细信息
- 根据对象的状态,我需要反复轮询对象的状态,直到它准备好,如果它还没有准备好。或者如果它准备好了就停止轮询。
- 可以随时将对象的状态从准备好更改为未准备好,或未准备好更改为准备好。这可以从投票结果中设置,或者在用户需要时由用户按需设置。
我尝试过类似以下的方法,但觉得这不是最好的解决方案:
this.http.getObjectDetails(this.id).subscribe()
timer(1000, 1000)
.pipe(
filter(() => this.object.status != 'READY'),
concatMap(() => {
return this.http.checkObjectStatus(this.id)
})
).subscribe()
首先,它没有连接两个订阅,其次,我不确定它是否可以处理状态从就绪变为未就绪的情况。
谢谢
解决方案
您可以使用递归调用自身直到响应准备好的函数来完成此操作。
const { of, iif } = rxjs;
const { switchMap, tap, delay } = rxjs.operators;
const http = url => of({ STATUS: (Math.random() > .7) ? 'READY' : 'NOT READY' })
const getObjectDetails = (id) => http(`url/{id}`).pipe(
tap(result => { console.log(result.STATUS); }),
switchMap(result => iif(() => result.STATUS === 'READY', of(result), getObjectDetails(id)))
);
getObjectDetails(1).subscribe(result => { console.log('finished'); });
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.6.3/rxjs.umd.min.js"></script>
推荐阅读
- javascript - TypeError:无法读取未定义的属性“地图”,传递道具时出现问题
- sql - 通过使用 SQL Server 2008 给出默认的月份日期来计算日期
- javascript - 如何在数组javascript中添加对象
- augmented-reality - 模型不在标记 ARjs 之上
- javascript - 树图高图的不同父组的多个颜色轴
- oracle - dbeaver 表格编辑受阻,怎么办?
- flutter - Flutter - 如何将日期列表传递给 showDatePicker 中的 selectableDayPredicate?
- amazon-web-services - 我在 AWS ECS 上部署了一个反应应用程序并购买了一个自定义域,但我无法在域名前使用“www”访问它
- c# - ASP.NET MVC 5 中自动生成的 EDMX 类的构造函数
- javascript - VueJS:$_FILES 未从前端接收数据到后端