首页 > 解决方案 > Rxjs 首先轮询对象详细信息,然后根据需要根据对象的状态重复轮询

问题描述

我想知道在 angular RxJS 中执行以下操作的最佳实践。

  1. 在页面加载时,我需要 http 获取对象的详细信息
  2. 根据对象的状态,我需要反复轮询对象的状态,直到它准备好,如果它还没有准备好。或者如果它准备好了就停止轮询。
  3. 可以随时将对象的状态从准备好更改为未准备好,或未准备好更改为准备好。这可以从投票结果中设置,或者在用户需要时由用户按需设置。

我尝试过类似以下的方法,但觉得这不是最好的解决方案:

this.http.getObjectDetails(this.id).subscribe()

timer(1000, 1000)
      .pipe(
        filter(() => this.object.status != 'READY'),
        concatMap(() => {
          return this.http.checkObjectStatus(this.id)
        })
      ).subscribe()

首先,它没有连接两个订阅,其次,我不确定它是否可以处理状态从就绪变为未就绪的情况。

谢谢

标签: angularrxjs

解决方案


您可以使用递归调用自身直到响应准备好的函数来完成此操作。

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>


推荐阅读