要将几个不相关的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以便我可以访问外部变量?我对其他选项持开放态度,但最好没有其他库。
答案 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);