Предположим, что мы имеем функцию getIds(), который принимает массив некоторых идентификаторов , как это:Keep задерживая запрос HTTP, пока новые Титулы не прибывают
getIds([4, 1, 32]);
Эта функция задержит HTTP вызов для 100мс. Но в течение 100 мс, если это та же функция вызывается снова:
getIds([1, 8, 5]);
Это приведет к сбросу таймера 100 мс и сохранить слияние пройденные идентификаторами. Он будет отправлять HTTP-запрос только в том случае, если он не вызывается кем-либо более чем на 100 мс.
Я новичок в 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, но не отбрасывая предыдущие значения. Вместо этого он должен поставить их в очередь. Я думаю, что мой вопрос немного расплывчатый. Позвольте мне изменить его. – ifadey