繁体   English   中英

带有Promise的Rx.js并发

[英]Rx.js concurrency with promises

我想通过一系列异步/网络操作(远程HTTP请求)将它们移动来处理对象数组。

在其中某些操作中,我想确保同时处理的项目不超过X个。

我该如何实现?

示例代码:

function someAsyncOp(item) {...} // returns a promise

var source = Rx.Observable.from([{item1},{item2},...])
source
  .flatMap((item) => {

    // I WANT THE FOLLOWING OPERATION TO BE EXECUTING  
    // ON AT MAX 10 ITEMS AT A TIME, NEXT ITEM SHOULD
    // BE SUBMITTED ONLY WHEN A SLOT GETS FREED AS A 
    // RESULT OF THE PROMISE SUCCEEDING OR FAILING

    return Rx.Observable.fromPromise(someAsyncOp(item))

  })
  .subscribe(
    console.log, 
    console.error, 
    () => console.log('completed')
  )

flatMap一个同胞称为flatMapWithMaxConcurrent ,它带有一个并发参数。 它在功能上类似于本杰明的答案所建议的map(fn).merge(n)

function someAsyncOp(item) {...} // returns a promise

var source = Rx.Observable.from([{item1},{item2},...])
source
   //Only allow a max of 10 items to be subscribed to at once
  .flatMapWithMaxConcurrent(10, (item) => {

    //Since a promise is eager you need to defer execution of the function
    //that produces it until subscription. Defer will implicitly accept a promise
    return Rx.Observable.defer(() => someAsyncOp(item))

    //If you want the whole thing to continue regardless of exceptions you should also
    //catch errors from the individual processes
                        .catch(Rx.Observable.empty())
  })
  .subscribe(
    console.log, 
    console.error, 
    () => console.log('completed')
  )

您可以使用map而不是flatMap merge

var concurrency = 10;
source.map(someAsyncOp).merge(concurrency).subscribe(x => console.log(x));

请注意,由于Promise迫切需要Promise,而Observable则是懒惰的,因此Promise不会削减它(Rx可以在没有Promise的情况下吸收Promise)。 我建议将其包装在create

 var delay = function(ms){ return new Promise(function(r){ setTimeout(r, 2000, ms) }); } var log = function(msg){ document.body.innerHTML += msg + "<br />"; } Rx.Observable.range(1000, 10).map(delay).merge(2).subscribe(log) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.7/rx.all.js"></script> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM