Rx java 如何压缩多个观测值(1kk),而不在阵列中预先分配它们

Rx java 如何压缩多个观测值(1kk),而不在阵列中预先分配它们,rx-java,reactive-programming,rxjs,Rx Java,Reactive Programming,Rxjs,我有一个函数,表示在db中的单个异步插入: function insertInDatabaseRx(data) { return Rx.Observable.create(function (observer) { db.insert(data, function (err) { if (err) { observer.onError(err); } else {

我有一个函数,表示在db中的单个异步插入:

function insertInDatabaseRx(data) {
    return Rx.Observable.create(function (observer) {
           db.insert(data, function (err) {
               if (err) {
                  observer.onError(err);
               } else {
                  observer.onCompleted();
               }
           });
    });
}
我需要做大量插入(1kk+次),并在完成之后做一些动作。我目前的执行情况:

var someLongArray = ...;

var massInsertion = [];
for (var i = 0; i < someLongArray.length; i++) {
    massInsertion.push(insertInDatabaseRx(someLongArray[i].data);
}

Rx.Observable.zip(massInsertion)
    .subscribe(
        function (x) {
            logger.debug('Next: %s', x);
        },
        function (e) {
            logger.error('Error: %s', e);
        },
        function () {
            //all done
            logger.info('all save done, terminating ... ');
            process.exit();
        });
var someLongArray=。。。;
var massInsertion=[];
for(var i=0;i
这是可行的,但我认为预先分配观察值数组并不能有效地利用资源(cpu/mem):

var massInsertion = [];
for (var i = 0; i < someLongArray.length; i++) {
    massInsertion.push(insertInDatabaseRx(someLongArray[i].data);
}
var massInsertion=[];
for(var i=0;i
如何在不预先分配观察值数组的情况下更有效地执行此任务?

您可以使用forkJoin()

function insertAll(){
var rxResult=insertinadabaserx(someLongArray[0]。数据);
for(var i=1;i
您可以使用forkJoin()

function insertAll(){
var rxResult=insertinadabaserx(someLongArray[0]。数据);
for(var i=1;i
我注意到的第一件事是,
InsertInDatabasex
不遵守可观察契约。在调用
OneError
后,不应该发出
onCompleted
。一个
否则的
就是修复该位所需的一切。@DaveModen谢谢!数据从哪里来?它是从数组来的吗?你确定你的数据库是这样做的吗没有大容量插入操作?@paulpdaniels是的,它来自数组,db没有大容量插入。对我来说,阻止插入是很好的,因为它运行在应用程序出口上,但db没有同步api,同样在rxjs中,我没有看到类似rxjava的
。ToBlock
方法。我注意到的第一件事是
InsertInDatabasex
不遵守可观察契约。在调用
onError
后,不应发出
onCompleted
。修复该位只需一个
即可。@DaveModen谢谢!数据
从哪里来?它来自数组吗?你确定你的数据库没有批量插入操作吗?@paulpdaniels是的,这是com从数组和db中删除数据并没有大容量插入。对我来说,阻塞插入是很好的,因为它运行在应用程序出口上,但db没有同步api,同样在rxjs中,我也没有看到类似rxjava的
。ToBlock
方法。
function insertAll() {
    var rxResult = insertInDatabaseRx(someLongArray[0].data);

    for (var i = 1; i < someLongArray.length; i++) {
        rxResult = rxResult.forkJoin(
            insertInDatabaseRx(someLongArray[i].data),
            function (result1, result2) {
                return result1 + result2;
            });
    }

    rxResult.map(...);
}