Rxjs 以异步方式处理管道中的数据

Rxjs 以异步方式处理管道中的数据,rxjs,Rxjs,我有一个处理函数,它以异步的方式工作——它接受一行输入文本并在下面的代码段中处理它——为了简化——它从行中提取数字。这些行来自输入大量GB的大型文件,并被一个接一个地读取和发送到管道。这是由下面的操作员“模拟”的。进程函数很慢,但读取行很快,所以关键点是逐个读取和处理行,以避免内存堆栈溢出 常数{of,Subject}=rxjs; const{take,bufferCount,map,finalize}=rxjs.operators; 设source=文本第11行、文本第22行、文本第33行/

我有一个处理函数,它以异步的方式工作——它接受一行输入文本并在下面的代码段中处理它——为了简化——它从行中提取数字。这些行来自输入大量GB的大型文件,并被一个接一个地读取和发送到管道。这是由下面的操作员“模拟”的。进程函数很慢,但读取行很快,所以关键点是逐个读取和处理行,以避免内存堆栈溢出

常数{of,Subject}=rxjs; const{take,bufferCount,map,finalize}=rxjs.operators; 设source=文本第11行、文本第22行、文本第33行//带行的大文件 .pipemapline=>processline,=>{ //回调/管道应该是什么样子???? } ; source.subscribex=>console.logx; //预期结果应该是: // 11 // 22 // 33 //这是第三方库-我无法更改它 函数processline,回调{ setTimeout_uuz=>{ 让结果=line.match/\d/[0]; 回调结果; },1+Math.random*9*100;//随机处理时间 }
您需要将回调转换为Promise,因为Promises可以用于rxjs流

此外,我还准备了一个或以下的代码片段

常数{of,Subject}=rxjs; const{concatMap}=rxjs.operators; const promiseWrapper=line=>newpromiseresolve=>processline,resolve; 让源=的 正文第11行, 正文第22行, 文本的第33行//带行的大文件 .pipeconcatMapitem=>promiseWrapperitem ; source.subscribex=>console.logx; //预期结果应该是: // 11 // 22 // 33 //这是第三方库-我无法更改它 函数processline,回调{ setTimeout_uuz=>{ 让结果=line.match/\d+/[0]; 回调结果; },1+数学随机*9*100; }
您需要将回调转换为Promise,因为Promises可以用于rxjs流

此外,我还准备了一个或以下的代码片段

常数{of,Subject}=rxjs; const{concatMap}=rxjs.operators; const promiseWrapper=line=>newpromiseresolve=>processline,resolve; 让源=的 正文第11行, 正文第22行, 文本的第33行//带行的大文件 .pipeconcatMapitem=>promiseWrapperitem ; source.subscribex=>console.logx; //预期结果应该是: // 11 // 22 // 33 //这是第三方库-我无法更改它 函数processline,回调{ setTimeout_uuz=>{ 让结果=line.match/\d+/[0]; 回调结果; },1+数学随机*9*100; } 可以使用将类型为fx、callback的函数转换为函数gx,该函数返回一个冷可观测值,并将结果传递给回调函数

从rxjs导入{bindCallback,of}; 从rxjs/operators导入{concatMap}; const boundProcess=bindCallbackprocess; 让source=文本的第11行、文本的第22行、text.pipe的第33行 concatMapline=>boundProcessline ; source.subscribex=>console.logx; //预期结果应该是: // 11 // 22 // 33 //这是第三方库-我无法更改它 函数processline,回调{ setTimeout=>{ 让结果=line.match/\d+/[0]; 回调结果; }, 1000; } 可以使用将类型为fx、callback的函数转换为函数gx,该函数返回一个冷可观测值,并将结果传递给回调函数

从rxjs导入{bindCallback,of}; 从rxjs/operators导入{concatMap}; const boundProcess=bindCallbackprocess; 让source=文本的第11行、文本的第22行、text.pipe的第33行 concatMapline=>boundProcessline ; source.subscribex=>console.logx; //预期结果应该是: // 11 // 22 // 33 //这是第三方库-我无法更改它 函数processline,回调{ setTimeout=>{ 让结果=line.match/\d+/[0]; 回调结果; }, 1000; }
由于您无法更改第三方方法,所以我怀疑您是否可以使用rxjs处理此问题。主要问题是第三部分api没有返回一个不符合rxjs基本需求的可观测值。此外,我们还可以通过使用延迟/去抖动操作符以某种方式管理rxjs,但同样因为JS事件循环的工作方式,所以提供的解决方案并不完美。如果您需要,您应该找到一种从第三方api返回可观察数据的方法can@user2216584Marcin给出解决方案-看看它,Hanks!这对我来说是一个新的学习。因为你不能改变第三方的方法,所以我怀疑你能用rxjs处理这个问题。主要问题是第三部分api没有返回一个不符合rxjs基本需求的可观测值。此外,我们还可以通过使用延迟/去抖动操作符以某种方式管理rxjs,但同样因为JS事件循环的工作方式,所以提供的解决方案并不完美。如果您需要,您应该找到一种从第三方api返回可观察数据的方法can@user2216584Marcin给出解决方案-看看它,Hanks!对我来说这是一门新的学问。
import { of } from "rxjs";
import { concatMap } from "rxjs/operators";

const promiseWrapper = line => new Promise(resolve => process(line, resolve));

let source = of("line 11 of text", "line 22 of text", "line 33 of text").pipe(
  concatMap(item => promiseWrapper(item))
);

source.subscribe(x => console.log(x));
// expected result shoud be:
// 11
// 22
// 33

// This is third-party library - I cannot change it
function process(line, callback) {
  setTimeout(_ => {
    let result = line.match(/\d+/)[0];
    callback(result);
  }, 1000);
}