在node.js中创建来自2D数组的promise

时间:2016-06-09 09:17:57

标签: node.js mongodb mongoose promise

要将几个不相关的csv文件导入mongodb,我解析文件客户端,然后发送"导入地图"到节点。在那里,他们被传递给一个函数来将它们插入mongoose / mongodb。该功能有效,类似于以下内容(少于承诺部分)。

Import.prototype.saveImport = function (importArray) {
    var writes = []; //promises
    for (var i = 0; i < importArray.length; i++) { //loop models
        var Model = mongoose.model(importArray[i].model);
        for (var j = 0; j < importArray[i].objects.length; j++) { //loop objects
            writes.push(function () {
                return new Promise(function (resolve, reject) {
                    var obj = importArray[i].objects[j];

                    var searchObj = {};
                    for (var k = 0; k < importArray[i].ImportIndex.length; k++) {
                        var index = importArray[i].ImportIndex[k];
                        searchObj[index] = obj[index];
                    }

                    Model.update(searchObj, {
                        $set: obj
                    }, {
                        upsert: true
                    }, function (err, raw) {
                        if (err)
                            console.log(err);
                        resolve();
                    });
                });
            });
        }
    }
    Promise.all(writes)
        .then(function () {
            console.log('all done');
        })
        .catch(console.error);
};

这个功能由于几个原因不起作用,它只是为了说明我想要做什么。我需要一些方法来等待所有mongodb写入完成,以便我可以向客户端发送回复。但我对如何实现它感到茫然。

Promise似乎是最简单的方法。但是如何在第二个循环中添加promises以便我可以访问外部变量?我对其他选项持开放态度,但最好没有其他库。

1 个答案:

答案 0 :(得分:0)

一种方法是你可以为promise.all为每一行创建一个新的promise,并将其推回到新的数组并调用promise.all。

for (var i = 0; i < write.length; i++) {
    promiseArr.push(new Promise(function(resolve, reject) {
        Promise.all(writes[i])
        .then(resolve)
        .catch(reject);
    }));
}

Promise.all(promiseArr)
.then(function () {
    console.log('all done');
})
.catch(console.error);