我被困在我正在使用的函数(我可以做到这一切都是错误的)。所以快速解释一下,我想在一个集合中添加批量数据,集合称为“Sites”,CSV的格式是网站,国家,类型。我正在尝试使用此承诺(Bluebird)。因此,考虑代码:蓝鸟与猫鼬使用Promise.Each
Promise.each(sites, sites => new Promise((resolve, reject) => {
//console.log(sites);
let name = tools.extractDomain(req, res, sites[0]);
let country = sites[1];
let group = sites[2];
if (name != "" && country != "" && group != "") {
Site.findOne({ name: name }, "_id", function(err, duplicate) {
if (false) {
console.log("Duplicate site: " + duplicate);
} else {
//console.log("Adding " + name)
let site = new Site()
site.name = name
site.meta = {}
site.group = group
site.country = country
site.geomix = []
site.addedBy = req.user._id
site.addedAt = Date.now()
site.saveAsync().then(function(response){
tools.saveHistory(req, res, response._id, response.name, "Website Meta fetched.");
tools.saveHistory(req, res, response._id, response.name, "Link added for the first time."); //Save in history
resolve(site);
}).catch(function (e){
console.log(name);
reject();
});
}
});
}else{
console.log('Wrong Format');
}
}).then((data) => {
console.log('All websites processed!');
addedSites.push(data);
}).catch(err => {
//console.error('Failed');
}));
res.send({ status: 'ok', message: ''});
我做Ajax调用,所以我返回res.send({状态:“OK”,邮件:“”}),我知道它在不正确的地方,我想要沿着res.send发送一些数据。目前它在代码实际完成之前发送标题。我想在Mongo中添加所有数据之后发送标题,但是在这种情况下,为了解决每个问题,我需要在“.each”的“.then”中发送标题,这样我会发送标题已经发送错误。
这可能有点混乱。我觉得我没有这样做。我有点疯了,以至于我找不到一个我能理解和实施的正确范例。
但最终我的主要问题是:使用Ajax调用什么是正确的添加方式让我们说使用承诺在集合中记录1000条记录,并实际控制那些添加失败和不添加的记录?
现在我的代码实际上工作,但逻辑肯定是错误的。
谢谢。
避免['Promise'构造反模式](https://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-它)!如果您需要提供'Site.findOne',请在单独的函数中执行此操作(或让Bluebird为您执行此操作)。 – Bergi