2016-03-27 85 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/operators/flatmapwithmaxconcurrent.md)如果您需要了解其他異步替代方法,您可以閱讀此頁http://xgrommx.github.io/rx-book/content/mappingr_rxjs_from_different_libraries/async /index.html – xgrommx

+0

@xgrommx我已經看過您的有用文檔,但沒有提及任何與「限制」功能等效的內容。 – homam

回答

4

deferflatMapWithMaxConcurrent組合爲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(...);