【问题标题】:Rxjs poll object details first then repeated poll based on an object's status if neededRxjs 首先轮询对象详细信息,然后根据需要根据对象的状态重复轮询
【发布时间】:2020-11-22 16:03:41
【问题描述】:

我想知道在 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()

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

谢谢

【问题讨论】:

  • 如果我们在准备好时停止轮询,我们如何知道状态更改为未准备好?
  • @ArashHatami。我有一个 ui 按钮,允许用户检查以强制检查。

标签: angular rxjs


【解决方案1】:

您可以将扩展运算符用于简单的“条件重复”行为。

this.http.getObjectDetails(this.id).subscribe()
let request = this.http.checkObjectStatus(this.id);

request.pipe(
  expand(
    res => {
      if (res.status == 'READY') {
        return empty();
      }
      else {
        return timer(1000).pipe(
          map(() => {
            return request
          })
        );
      }
    }
  ),
).subscribe(res => { });

也导入

import { empty } from 'rxjs';
import { expand } from 'rxjs/operators';

【讨论】:

  • this.request 订阅后未定义。你的代码会报错
  • @JingshaoChen 这是示例 :)) 不用于复制粘贴,好的,我现在就编辑它
  • 您的应答会循环调用请求,并每秒触发一堆额外的请求。并且它一开始不会调用获取详细信息
  • @JingshaoChen 你说的对,再检查一下,谢谢
  • 这仍然不能保证获取状态获取详细信息之后运行。假设获取详细信息延迟 5 秒,获取详细信息解决后获取状态将运行 5 次。
【解决方案2】:

您可以使用递归调用自身直到响应准备好的函数来做到这一点。

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>

【讨论】:

    猜你喜欢
    • 2013-09-24
    • 2016-11-16
    • 2021-11-25
    • 2023-02-07
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 2021-07-20
    • 2015-12-14
    相关资源
    最近更新 更多