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

我正在将数据批量加载到数据库中,并使用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
  // 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正是我需要的。