Javascript RxJS中涉及异步步骤的批处理流

Javascript RxJS中涉及异步步骤的批处理流,javascript,rxjs,stream-processing,Javascript,Rxjs,Stream Processing,我正在处理从RxNode.fromReadableStream()中提取的数据流,其中有一个中间步骤是异步的,并且只能以一定的并发性运行,同时输出步骤只能以串行、离散批次运行 基本上是一个经典的转换管道: cat file | parallel -P5 transform | xargs -n1000 process 有了承诺,它将是(极其简化的): line.on('readable',function read(){ 让线; while(line=lines.read()){ 排队。推(线

我正在处理从
RxNode.fromReadableStream()
中提取的数据流,其中有一个中间步骤是异步的,并且只能以一定的并发性运行,同时输出步骤只能以串行、离散批次运行

基本上是一个经典的转换管道:

cat file | parallel -P5 transform | xargs -n1000 process
有了承诺,它将是(极其简化的):

line.on('readable',function read(){
让线;
while(line=lines.read()){
排队。推(线);
如果(queue.length>=10){
返回Promise.map(队列,项=>someAsyncTransformations(项),{concurrency:5})
.然后(项目=>someFinalAsyncProcessing(项目))
.然后(读);
}
}
});
通过在转换后插入控制器,我可以确保转换独立执行,从而实现管道化;延迟和合并的结合似乎让我能够控制异步性和并发性

但是,我使用
controlled()
来确保映射步骤有效地暂停处理,直到完成为止。它看起来真的很难看——难道没有更好的、非手动的方法来实现无损背压吗

此外,我相信我必须对转换器使用相同的控制技巧,否则整个流将在一次过中转换并耗尽内存。还有更惯用的方法吗

最后:如果输入的大小不能被批处理大小整除,那么上述方法实际上不起作用。出于某种原因,如果我使用的
request()
多于剩余项目的数量,整个管道就会退出
onComplete
甚至没有被调用。实际上,如果我一开始用一个大数字调用
request()
,整个管道似乎会无限期地重复相同的内容。Bug还是预期行为


编辑:我发现我可以使用
concatMap
。Nevermind.

是不是
Rx.observed.fromPromise(transform)
一个打字错误?另外,
defer
将接受一个
Promise
您不必使用
fromPromise
显式转换,它应该是
fromPromise(transform(item))
。现在更正。我发现,
延迟
将接受承诺,谢谢。再看看cdnjs上的最新版本,它似乎确实有一些bug,导致了至少一些麻烦,你能试试github的最新版本吗?没错,当前的master(显然是3.0版)修复了我遇到的请求bug。谢谢