我有一个可观察的myObservable
,它以不同的时间间隔发出一些物品。例如,第一项和第二项之间的时间间隔可以是1秒,而第二项和第三项之间的时间间隔可以是3秒。
对于每个项目,使用方法this.sendMessage()
发送HTTP请求。
问题在于请求之间的时间间隔应至少为2秒。将所有请求延迟两秒钟不是最佳解决方案。例如对于第一个请求,我不想延迟。当两个发射项目之间的时间差超过两秒时,我也不想延迟。
这是一个可行的解决方案,可以满足我的要求。但是我想知道是否还有类似rxjs的解决方案?我在玩delay()
和delayWhen()
,但是我没有找到使它工作的方法。
有人有解决方案吗?
let lastSendTimestamp = null;
myObservable.pipe(
concatMap(async body => {
// Calculate delay time
let delayTime = 0;
if (!lastSendTimestamp) {
delayTime = 0;
} else if (Date.now() - lastSendTimestamp > 2000) {
delayTime = 0;
} else {
delayTime = 2000 - (Date.now() - lastSendTimestamp);
}
// Wait until delay is over
await new Promise(resolve => setTimeout(resolve, delayTime));
lastSendTimestamp = Date.now();
return await this.sendMessage(body);
}),
).subscribe(result => {
});
答案 0 :(得分:0)
您可以改用timer
并与异步请求链接。不需要承诺
let lastSendTimestamp = null;
myObservable.pipe(
concatMap(body => {
// Calculate delay time
let delayTime = 0;
if (!lastSendTimestamp) {
delayTime = 0;
} else if (Date.now() - lastSendTimestamp > 2000) {
delayTime = 0;
} else {
delayTime = 2000 - (Date.now() - lastSendTimestamp);
}
lastSendTimestamp = Date.now();
return timer(delayTime).pipe(concatMap(res=>this.sendMessage(body)));
}),
).