Я застрял в функции, с которой работаю (я могу делать все это неправильно). Итак, краткое объяснение, я хочу добавить объемные данные в коллекцию, коллекция называется «Сайты», формат CSV - сайт, страна, тип. Я пытаюсь использовать обещания для этого (Bluebird). Итак, рассмотрим код:
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({status: 'ok', message: ''}), я знаю, что это не то место, и я хочу отправить некоторые данные по res.send. В настоящее время он отправляет заголовки до фактического завершения кода. Я хочу отправить заголовки после того, как все данные будут добавлены в Mongo, но для каждого из них в этом случае он разрешает (), поэтому, если я отправлю заголовки внутри «.then» из «.each», я получу уже отправленные заголовки с ошибкой .
Это может немного сбивать с толку. Я чувствую, что делаю это неправильно. Я немного схожу с ума и не могу найти подходящий пример, который я могу понять и реализовать.
Но, в конце концов, мой главный вопрос: используя вызов Ajax, как правильно добавить, скажем, 1000 записей в коллекцию с использованием промисов и фактически правильно контролировать тех, кто не добавляет, и тех, кто этого не делает?
Прямо сейчас мой код действительно работает, но логика точно неверна.
Спасибо.
Promise
конструктора! Если вам нужно промисифицироватьSite.findOne
, сделайте это в отдельной функции (или просто позвольте Bluebird сделать это за вас). - person Bergi   schedule 31.05.2017