【发布时间】:2016-09-30 18:34:08
【问题描述】:
假设我们有一个 getIds() 函数,它接受一个包含一些 id 的数组 像这样:
getIds([4, 1, 32]);
此函数将 HTTP 调用延迟 100 毫秒。但在 100 毫秒内,如果这 再次调用相同的函数:
getIds([1, 8, 5]);
它将重置 100 毫秒计时器并继续合并传递的 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 但不丢弃先前值的运算符。相反,它必须将它们排队。
【问题讨论】: