2016-06-01 1 views
0

Предположим, что мы имеем функцию 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); 
}); 

редактировать: Ищу оператор, который ведет себя как дребезг, но не опуская предыдущие значения. Вместо этого он должен поставить их в очередь.

ответ

0

Я не уверен, что захватил именно то, что из следующего вы ищете, поэтому я просто опишу оба. Есть два «на основе модели времени», которые чаще всего подходит для такого рода проблемы в моем опыте:

  • противодребезгового

rxmarbles URL: http://rxmarbles.com/#debounce; github doc

Как говорится в документации, она

Выдает элемент из источника наблюдаемых после конкретной TimeSpan прошло без Наблюдаемые опуская любые другие предметы.

  • дроссельная

rxmarbles URL: нет еще; github doc

Возвращает Наблюдаемый, который излучает только первый элемент, излучаемый источник при наблюдаемом последовательных временных окнах определенного продолжительности.

В принципе, если вы хотели бы подождать, пока входы не успокоится в течение определенного периода времени, прежде чем принимать меры, вы хотите дребезга. Если вы не хотите ждать вообще, но не хотите делать более одного запроса в течение определенного времени, вам нужно будет throttle.

Надеюсь, что это имеет смысл.

+0

Спасибо за ответ, но я не искал этих операторов. Мне нужен оператор, который ведет себя так же, как debounce, но не отбрасывая предыдущие значения. Вместо этого он должен поставить их в очередь. Я думаю, что мой вопрос немного расплывчатый. Позвольте мне изменить его. – ifadey