RxJS:如何在前一个流完成后才启动下一个流
我正在将数据批量加载到数据库中,并使用RxJS控制管道RxJS:如何在前一个流完成后才启动下一个流,rxjs,Rxjs,我正在将数据批量加载到数据库中,并使用RxJS控制管道 let event = 0; parseStreamOfIndividualObjectsToInsert().pipe( bufferCount(100), // batch the inserts in groups of 100 flatMap(batch => batchInsert(batch) // I want to go on only when all batch inserts are complete
let event = 0;
parseStreamOfIndividualObjectsToInsert().pipe(
bufferCount(100), // batch the inserts in groups of 100
flatMap(batch => batchInsert(batch)
// I want to go on only when all batch inserts are complete
// performFurtherOperationOnlyOnce()
)
.subscribe(() => console.log('Hopefully will only log one event: ++event));
目前,observer的下一个方法是在每个batchInsert()之后触发,但我只希望它在所有批插入完成后触发一次
我已经尝试了concat和flatMap等的多种组合,但仍然从bulkInserts()flatMap行发出多个事件。理想情况下,事件只会在完成时发出
是否有可能只在完成时发出
谢谢您可以使用
toArray
将可观测数据流减少到列表中
您需要确保parseStreamOfIndividualObjectsToInsert()
最终将完成。我将bufferCount
替换为take
,以强制流完成
let event = 0;
parseStreamOfIndividualObjectsToInsert().pipe(
take(100), // Force the stream to complete after 100 emissions
// bufferCount(100),
flatMap(batch => batchInsert(batch),
toArray() # wait for Observable to complete
)
.subscribe(() => console.log('Hopefully will only log one event: ++event));
您可以使用
toArray
将可观测数据流减少到列表中
您需要确保parseStreamOfIndividualObjectsToInsert()
最终将完成。我将bufferCount
替换为take
,以强制流完成
let event = 0;
parseStreamOfIndividualObjectsToInsert().pipe(
take(100), // Force the stream to complete after 100 emissions
// bufferCount(100),
flatMap(batch => batchInsert(batch),
toArray() # wait for Observable to complete
)
.subscribe(() => console.log('Hopefully will only log one event: ++event));
toArray
操作将执行您想要的操作。它将将整个流减少为一个包含所有内容的数组的事件:
const { bufferCount, flatMap, toArray } = require('rxjs/operators');
let event = 0;
parseStreamOfIndividualObjectsToInsert().pipe(
bufferCount(100), // batch the inserts in groups of 100
flatMap(batch => batchInsert(batch)
toArray()
)
.subscribe(() => console.log('Hopefully will only log one event: ++event));
toArray
操作将执行您想要的操作。它将将整个流减少为一个包含所有内容的数组的事件:
const { bufferCount, flatMap, toArray } = require('rxjs/operators');
let event = 0;
parseStreamOfIndividualObjectsToInsert().pipe(
bufferCount(100), // batch the inserts in groups of 100
flatMap(batch => batchInsert(batch)
toArray()
)
.subscribe(() => console.log('Hopefully will only log one event: ++event));
您可以使用添加完成处理程序。我遗漏了什么吗?您可以使用添加完成处理程序。我错过什么了吗?非常感谢。它起作用了。我在想,我必须从subscribe的observable的完整函数触发第二个observable流的开始。我想这是有道理的,尽管只是发射一个阵列。我希望它被称为不同的东西,但是,我希望文档实际上有一些内容。非常感谢。它起作用了。我在想,我必须从subscribe的observable的完整函数触发第二个observable流的开始。我想这是有道理的,尽管只是发射一个阵列。我希望它被称为不同的东西,但是,我希望文档实际上有一些内容。非常感谢您的回复。toArray正是我需要的。非常感谢您的回复。toArray正是我需要的。