Каким будет самый идиоматический способ получения значений Наблюдаемого на определенное количество времени? Например, допустим, у меня есть Observable, созданный из большого массива, и я хочу дать значение каждые 2 секунды. Является ли комбинация interval
и selectMany
лучшим способом?Отдельные наблюдаемые значения по конкретному времени в RxJS
ответ
Для вашего конкретного примера, идея заключается в том, чтобы отобразить значение каждого из массива наблюдаемой, что даст свой результат после задержки, а затем сцепить результирующий поток наблюдаемых:
var delayedStream = Rx.Observable
.fromArray([1, 2, 3, 4, 5])
.map(function (value) { return Rx.Observable.return(value).delay(2000); })
.concatAll();
Другие примеры могут действительно используйте timer
или interval
. Это просто зависит.
Например, если ваш массив действительно очень большой, то вышеизложенное вызовет достаточное количество давления в памяти (потому что он создает N
наблюдаемых для действительно больших N
). Вот альтернатива, которая использует interval
лениво ходить массив:
var delayedStream = Rx.Observable
.interval(2000)
.take(reallyBigArray.length) // end the observable after it pulses N times
.map(function (i) { return reallyBigArray[i]; });
Это один даст следующее значение из массива каждые 2 секунды, пока она не итерированные по всему массиву.
В то время как ответ Брэндона получает суть идеи, вот версия, которая немедленно дает первый элемент, а затем помещает время между следующими элементами.
var delay = Rx.Observable.empty().delay(2000);
var items = Rx.Observable.fromArray([1,2,3,4,5])
.map(function (x) {
return Rx.Observable.return(x).concat(delay); // put some time after the item
})
.concatAll();
Обновлен для нового RxJS:
var delay = Rx.Observable.empty().delay(2000);
var items = Rx.Observable.fromArray([1,2,3,4,5])
.concatMap(function (x) {
return Rx.Observable.of(x).concat(delay); // put some time after the item
});
Я думаю, что с помощью почтового индекса производить более и более читаемый код, по-прежнему используя только 3 наблюдаемые.
var items = ['A', 'B', 'C'];
Rx.Observable.zip(
Rx.Observable.fromArray(items),
Rx.Observable.timer(2000, 2000),
function(item, i) { return item;}
)
лучший ответ до сих пор – gropapa
Согласитесь, что zip - это чистый подход. Вот функция многократного использования, чтобы генерировать поток интервал для массива:
function yieldByInterval(items, time) {
return Rx.Observable.from(items).zip(
Rx.Observable.interval(time),
function(item, index) { return item; }
);
}
// test
yieldByInterval(['A', 'B', 'C'], 2000)
.subscribe(console.log.bind(console));
Это основано на farincz's answer, но немного короче, используя .zip
как метод экземпляра.
Кроме того, я использовал Rx.Observable.from()
, потому что Rx.Observable.fromArray()
является deprecated.
Для RxJS 5:
Rx.Observable.from([1, 2, 3, 4, 5])
.zip(Rx.Observable.timer(0, 2000), x => x)
.subscribe(x => console.log(x));
- 1. Chaining Наблюдаемые в RxJS
- 2. Функция повторного вызова, возвращающая наблюдаемые значения Rxjs
- 3. Chained rxjs Наблюдаемые операторы
- 4. Zip replayable RxJS наблюдаемые
- 5. Конкатенация rxjs Наблюдаемые
- 6. Rxjs Promise как Наблюдаемые
- 7. RxJS - Наблюдаемые модули - бросьте неопределенные
- 8. Цепи RxJS Наблюдаемые с интервалом
- 9. угловые2, наблюдаемые результаты фильтра RxJs?
- 10. Как использовать наблюдаемые значения RxJS в последовательном порядке?
- 11. RxJS Наблюдаемые называют в обратном порядке
- 12. Цепочные наблюдаемые с RxJS в Angular2
- 13. Как изменить данные, хранящиеся в RxJS, наблюдаемые?
- 14. Chaining RxJs Наблюдаемые в угловых 2
- 15. Как создать Горячие Наблюдаемые в RxJS 5
- 16. Как сбросить все наблюдаемые значения по умолчанию
- 17. Наблюдаемые по интервалу RxJava наблюдаемые занимают больше времени, чем указано
- 18. RxJS/Угловой: Как застегнуть наблюдаемые массивы объектов
- 19. Угловые 2 и RxJS Наблюдаемые только обновления по таймауту
- 20. Rxjs передавать данные после ошибки на Наблюдаемые
- 21. SQL SERVER 2012 значения сумм по конкретному дате времени
- 22. Почему эти наблюдаемые RxJS производят странные выходы?
- 23. RxJS Наблюдаемые что опросы, пока условие истинно
- 24. Angular2 RxJs Наблюдаемые: фильтр против карты?
- 25. RxJs Наблюдаемые из поддерживается с потянув
- 26. Как связать rxjs Наблюдаемые операции с угловыми2?
- 27. RxJs создают наблюдаемые результаты других наблюдений
- 28. RxJS Наблюдаемые методы для назначенной переменной
- 29. Группа SQL по конкретному периоду времени
- 30. Угловые 2: Цепочки RxJS Наблюдаемые в ретрансляторе маршрута
Примечание 'return' теперь' of': https://github.com/ReactiveX/rxjs/blob/master/MIGRATION.md –
Теперь это может быть 'concatMap' (гадание concatMap новее 2014?). Это просто ставит их в очередь (в противном случае все они испускаются вместе с задержкой) –
например. '.concatMap (x => Observable.of (x) .concat (Observable.empty(). delay (5000)))' –