2016-03-27 4 views
4

Async.js mapLimit и его семейство функций <name>Limit в основном работают как семафор: они позволяют запускать ограниченное количество задач одновременно, в то время как дополнительные входящие задачи добавляются в очередь. Очередь становится производителем (холодным? Подключенным?). Запуск задачи сбрасывает элемент из очереди, как только появляется место (одна из его задач заканчивается).RxJS эквивалент Async.js mapLimit

Таким образом, ограниченное количество одновременных задач всегда активны.

Как достичь аналогичной функциональности в RxJS?

+2

Конечно, вы можете использовать как л [ 'flatMapWithMaxConcurrent'] (https://github.com/Reactive-Extensions/RxJS/ blob/master/doc/api/core/operator/flatmapwithmaxconcurrent.md), также если вам нужно знать о других альтернативах для async, вы можете прочитать эту страницу http://xgrommx.github.io/rx-book/content/mappingr_rxjs_from_different_libraries/async /index.html – xgrommx

+0

@xgrommx Я видел ваши полезные документы, но нет упоминания об эквиваленте ' Limit'. – homam

ответ

4

Сочетание defer и flatMapWithMaxConcurrent является RxJs способ сделать это:

// returns a promise 
function runSomeJob(input) { ... } 

function runSomeJobObservable(input) { 
    return Rx.Observable.defer(function() { 
     return runSomeJob(input); 
    }); 
} 

var inputStream = // some Rx.Observable 

// only allow 5 jobs to run concurrently 
var outputStream = inputStream 
    .flatMapWithMaxConcurrent(5, runSomeJobObservable); 

ouputStream.subscribe(...); 

 Смежные вопросы

  • Нет связанных вопросов^_^