假设我们有一个函数getIds(),它接受一些id的数组 像这样:
getIds([4, 1, 32]);
此函数会将HTTP调用延迟100ms。但如果这是100毫秒 再次调用相同的函数:
getIds([1, 8, 5]);
它将重置100ms计时器并保持合并传递的ID。它会 只有在没有人调用超过100毫秒的情况下才发送HTTP请求。
我是RxJS的新手,这是我尝试解决这个问题,但我有 感觉可以更好地解决这个问题。
https://jsfiddle.net/iFadey/v3v3L0yd/2/
function getIds(ids) {
let observable = getIds._observable,
subject = getIds._subject;
if (!observable) {
subject = getIds._subject = new Rx.ReplaySubject();
observable = getIds._observable = subject
.distinct()
.reduce((arr, id) => {
arr.push(id);
return arr;
}, [])
// Some HTTP GET request will go here
// whose results may get flatMapped here
.publish()
.refCount()
;
}
ids.forEach((id) => {
console.log(id);
subject.next(id);
});
clearTimeout(getIds._timer);
getIds._timer = setTimeout(() => {
getIds._observable = null;
getIds._subject = null;
subject.complete();
}, 100);
return observable;
}
getIds([1, 2, 3])
.subscribe((ids) => {
console.log(ids);
});
getIds([3, 4, 5])
.subscribe((ids) => {
console.log(ids);
});
修改 我正在寻找一个像debounce一样但不丢弃先前值的运算符。相反,它必须排队。
答案 0 :(得分:0)
我不确定是否准确捕获了您正在寻找的以下哪一项,因此我将简单地描述两者。有两种基于时间的模式"根据我的经验,这些问题最常适合此类问题:
rxmarbles url:http://rxmarbles.com/#debounce; github doc
正如文档中所述,
在特定时间跨度后从源Observable发出一个项目 已经过了没有Observable省略任何其他项目。
rxmarbles url:还没有; github doc
返回一个Observable,它只发出由第一个项发出的项 source在指定的连续时间窗口期间可观察 持续时间。
基本上,如果您想等到输入已经安静一段时间后再采取行动,您想要去抖。如果您根本不想等待,但又不希望在特定时间内进行多次查询,则需要加油。
希望它有意义。