【发布时间】:2018-04-17 20:17:57
【问题描述】:
上下文
我需要从具有可变过期时间(在响应中指定)的服务器获取数据。一旦到期,我需要再次获得它。所以我想创建一个流,它发出一个异步请求并在该请求的响应中指定的时间后重复该请求。
我尝试了什么
这是我的第一次尝试,但 repeatWhen 无法访问最后的回复。而不是每 1000 毫秒重复一次,我想根据响应的过期属性来做。
const { Observable, defer, of } = rxjs;
const { repeatWhen, delay, map, take } = rxjs.operators;
let count = 0;
function api() {
return of({ data: count++, expiration: Math.random() * 1000 });
}
defer(() => api()).pipe(
repeatWhen((notification) => notification.pipe(delay(1000))),
map((response) => response.data),
take(5)
).subscribe((x) => { console.log(x); });
<script src="https://unpkg.com/rxjs@rc/bundles/rxjs.umd.min.js"></script>
问题
使用 rxjs,如何进行 api 调用并根据其最后响应延迟重复调用?
更新
从技术上讲,这可以满足我的要求,但它有点笨拙……所以我想要一个更好的解决方案。
const { Observable, defer, of, BehaviorSubject, timer } = rxjs;
const { repeatWhen, delay, map, take, tap, switchMap } = rxjs.operators;
let count = 0;
function api() {
return of({ data: count++, expiration: Math.random() * 1000 });
}
const trigger = new BehaviorSubject(0);
trigger.pipe(
switchMap((expiration) => timer(expiration)),
switchMap(() => api().pipe(
tap((response) => { trigger.next(response.expiration); })
)),
take(5)
).subscribe((x) => { console.log(x); });
<script src="https://unpkg.com/rxjs@rc/bundles/rxjs.umd.min.js"></script>
【问题讨论】:
-
否决评论?
-
为什么不使用网络套接字?那不是很好而且很高效。
-
@MohhamadHasham 这实际上只是将问题向下移动了一个级别。我必须在某个地方设置一个计时器。
标签: javascript rxjs