2015-12-30 5 views
2

Предположим, у меня есть 10 URL-адресов, и я хочу сделать HTTP-запрос для каждого из них.Ограничить количество запросов одновременно с помощью RxJS

Я мог бы создать наблюдаемые URL-адреса, затем .flatMap() запросы для каждого из них, а затем .subscribe для получения результатов. Но это сделало бы все запросы сразу.

Есть ли способ, чтобы наложить ограничение на число запросов к фиксированному числу, чтобы не перегружать сервер

ответ

1

У меня такая же проблема, и теперь я нашел решение. ссылка на this answer

Если вы создаете наблюдаемый функцией fromNodeCallback или возвращаете Promise, он создает горячий наблюдаемый и будет выполняться сразу после flatMap и подписаться. Так flatMapWithMaxConcurrent или map & слияние не работает должным образом.

var start = Date.now() 
 
var now =()=>Date.now()-start 
 
var test = Rx.Observable.fromNodeCallback(function(i, cb){ 
 
\t console.log(i, 'access', now()); 
 
\t setTimeout(function(){ 
 
\t \t cb(null, i) 
 
\t }, 1000); 
 
}) 
 

 
Rx.Observable.from([1,2,3]) 
 
\t .flatMapWithMaxConcurrent(1, x=>test(x)) 
 
\t .subscribe(x=>console.log(x, 'finish', now())) 
 

 
/* output: 
 
1 access 2 
 
2 access 16 
 
3 access 16 
 
1 finish 1016 
 
2 finish 1016 
 
3 finish 1017 
 
*/
<script src="http://www.cdnjs.net/ajax/libs/rxjs/4.1.0/rx.all.js"></script>

Вам нужно преобразовать его в холодной наблюдаемыми, просто использовать Rx.Observable.defer.

var start = Date.now() 
 
var now =()=>Date.now()-start 
 
var test = Rx.Observable.fromNodeCallback(function(i, cb){ 
 
\t console.log(i, 'access', now()); 
 
\t setTimeout(function(){ 
 
\t \t cb(null, i) 
 
\t }, 1000); 
 
}) 
 

 

 
Rx.Observable.from([1,2,3]) 
 
\t .flatMapWithMaxConcurrent(1, x=>Rx.Observable.defer(()=>test(x))) 
 
// \t .map(x=>Rx.Observable.defer(()=>test(x))).merge(1) // this works too 
 
\t .subscribe(x=>console.log(x, 'finish', now())) 
 
    
 
/* output: 
 
1 access 3 
 
1 finish 1004 
 
2 access 1005 
 
2 finish 2005 
 
3 access 2006 
 
3 finish 3006 
 
*/
<script src="http://www.cdnjs.net/ajax/libs/rxjs/4.1.0/rx.all.js"></script>

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