Это решение довольно беспорядочно, потому что у вас есть большая смесь асинхронных методов, смешанных в одной функции: события, обещания и обратные вызовы, а кроме того, есть al oop. Это действительно беспорядок, и обычно этого следует избегать. шаги выше, чем это. Для своей базы данных вы должны go найти и использовать интерфейс обещания к базе данных. Для ваших событий, поскольку это одноразовые события, вы можете создать оболочку обещания для объекта, чтобы получать уведомления об открытии и событиях ошибки.
Но, поскольку я не знаю всех компонентов, которые вы ' при использовании я не могу сделать эту часть за вас. Итак, мы рассмотрим, что мы могли бы сделать, чтобы исправить соответствующую поддержку на уровне обещаний в этой комбинации методов.
const {promisify} = require('util');
function addDataToDb(articleData) {
return new Promise((resolve, reject) => {
initMongoDb();
kanpionDb.on('error', err => {
console.error('connection error:', error);
reject(error);
});
kanpionDb.once('open', function () {
SiteUrlModel.init().then(() => {
return Promise.all(articleData.map(articleItem => {
let model = new SiteUrlModel(articleItem);
model.savePromise = promisify(model.save);
return model.savePromise().then(() => {
console.log("Success " + articleItem.siteName);
}).catch(err => {
console.log("Failed: " + articleItem.siteName);
throw err;
});
}));
}).then(resolve, reject);
});
});
}
// usage:
addDataToDb(articleData).then(() => {
console.log("All Done");
}).catch(err => {
console.log(err);
});
Сводка методов:
- Из-за события, нам придется заключить в созданное вручную обещание, которое мы разрешим или отклоним, когда закончим.
.forEach()
l oop заменяется на Promise.all(articleData.map(...))
, что даст нам обещание, которое сообщает нам, когда все сохранения выполнены. .save(callback)
необходимо заменить на обещанную версию .save()
. В идеале вы должны просто использовать здесь обещанную версию интерфейса вашей базы данных, но я показал, как вручную назначить функцию .save()
, если это необходимо. - Отклонение подключения к событию
error
. - Принять решение и отклонить обещание
SiteUrlModel.init()
. - Связать обещание
Promise.all()
с обещанием SiteUrlModel.init()
.