Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何限制flatMap的并发性?_Javascript_Rxjs - Fatal编程技术网

Javascript 如何限制flatMap的并发性?

Javascript 如何限制flatMap的并发性?,javascript,rxjs,Javascript,Rxjs,我正在尝试使用RxJS编写一个脚本来处理数百个日志文件,每个日志文件大约1GB。脚本的骨架看起来像 Rx.Observable.from(arrayOfLogFilePath) .flatMap(function(logFilePath){ return Rx.Node.fromReadStream(logFilePath) .filter(filterLogLine) }) .groupBy(someGroupingFunc) .map(someFurtherProcessing)

我正在尝试使用RxJS编写一个脚本来处理数百个日志文件,每个日志文件大约1GB。脚本的骨架看起来像

Rx.Observable.from(arrayOfLogFilePath)
.flatMap(function(logFilePath){
   return Rx.Node.fromReadStream(logFilePath)
   .filter(filterLogLine)
})
.groupBy(someGroupingFunc)
.map(someFurtherProcessing)
.subscribe(...)
代码可以工作,但请注意,所有日志文件的过滤步骤将同时启动。但是,从文件系统IO性能的角度来看,最好一个接一个地处理一个文件(或者至少将并发限制为几个文件,而不是同时打开所有数百个文件)。在这方面,我如何以“功能性反应方式”实现它

我曾经想到过调度程序,但不知道它在这里有什么帮助。

您可以使用它来限制并发性。因为
.merge(maxConcurrent)
将一个元可观察对象(可观察对象的可观察对象)展平为一个可观察对象,所以需要将
.flatMap
替换为
.map
,以便输出是一个元可观察对象(“unflat”),然后调用
.merge(maxConcurrent)


这段代码还没有经过测试(因为我无法访问您拥有的开发环境),但这是如何继续的。RxJS没有很多带有并发参数的操作符,但是您几乎可以使用
.merge(maxConcurrent)

来完成所需的操作。我刚刚用RxJS 5解决了一个类似的问题,所以我希望这个解决方案可以帮助其他人解决类似的问题

//模拟始终并行处理2个请求(当一个请求完成时,它将开始再处理一个请求),
//重试两次,如果重试失败,则在流上推送错误。
//const Rx=require('rxjs-es6/Rx');
//--Global variabel只是为了证明它是有效的--
设parallelRequests=0;
// --------------------------------------------------
函数模拟请求(req){
控制台日志(“请求”+req);
//---记录重试次数---
var重试=0;
// ----------------------
//无法重试承诺,需要在做出承诺之前重新启动。
返回Rx.Observable.of(req).flatMap(req=>newpromise((解析,拒绝)=>{
var random=Math.floor(Math.random()*2000);
//--证明它是有效的--
如果(重试){
log(“重试请求”+req+,重试”+retry);
}否则{
并行请求++;
}
// ---------------------------
设置超时(()=>{
if(随机<900){
重试++;
返回拒绝(req+“!!!失败!!!”);
}
返回解析(req);
},随机);
})).重试(2).捕获(e=>Rx.Observable.of(e));
}
可观测范围(1,10)
.flatMap(e=>SimulaterRequest(e),null,2)
//--证明它是有效的--
.do(()=>{
log(“ParallelRequests”+ParallelRequests);
并行请求--;
})
// ---------------------------
.subscribe(e=>console.log(“来自请求的响应”+e),e=>console.log(“不应该发生,错误:+e),e=>console.log(“完成”)

这正是我想要做的。我有500个URL要加载,不想同时启动所有请求。我使用了地图(5),但它不工作。。。所有的请求都是同时发出的。@Roaders这个解决方案成功了吗?我也在尝试。但是,所有请求都是同时触发的。我搜索了所有地方,但没有找到任何东西。例如,如果您正在进行异步http调用,则需要将其包装在Rx.defer()中,以便Rx可以决定何时进行调用(例如,如果失败,请重试),我有同样的问题,但是关于Rx.NET。可能吗?
Rx.Observable.from(arrayOfLogFilePath)
.map(function(logFilePath){
   return Rx.Node.fromReadStream(logFilePath)
   .filter(filterLogLine)
})
.merge(2) // 2 concurrent 
.groupBy(someGroupingFunc)
.map(someFurtherProcessing)
.subscribe(...)