/ / Продължаване на правилното изпълнение на множество създава + актуализации - обещавам, sequelize.js

Проследяване на правилното изпълнение на множество създава + актуализации - обещание, sequelize.js

Имам работа cron, която остъргва списък с елементиуеб сайт и след това вмъква или актуализира записи в база данни. Когато изтривам страницата, искам да създам записи за нови, които още не са създадени, в противен случай да актуализират всички съществуващи. В момента правя нещо подобно:

// pretend there is a "Widget" model defined

function createOrUpdateWidget(widgetConfig) {
return Widget.find(widgetConfig.id)
.then(function(widget) {
if (widget === null) {
return Widget.create(widgetConfig);
}
else {
widget.updateAttributes(widgetConfig);
}
});
}

function createOrUpdateWidgets(widgetConfigObjects) {
var promises = [];

widgetConfigObjects.forEach(function(widgetConfig) {
promises.push(createOrUpdateWidget(widgetConfig));
});

return Sequelize.Promise.all(promises);
}


createOrUpdateWidgets([...])
.done(function() {
console.log("Done!");
});

Това изглежда добре, но не съм сигурен дали ще съмправи това "правилно" или не. Дали всички обещания, които изпълняват взаимодействията на DB, трябва да се изпълняват серийно, или как ги определям добре? Има ли по-добър начин да направите това?

Отговори:

6 за отговор № 1

Това, което правиш, е доста идиоматично и отлично, единствената възможност за подобрение е да използваш факта, че Sequelize използва Bluebird за обещания, за да получиш .map безплатно, което ви позволява да конвертирате:

function createOrUpdateWidgets(widgetConfigObjects) {
var promises = [];

widgetConfigObjects.forEach(function(widgetConfig) {
promises.push(createOrUpdateWidget(widgetConfig));
});

return Sequelize.Promise.all(promises);
}

В:

function createOrUpdateWidgets(widgetConfigObjects) {
return Sequelize.Promise.map(widgetConfig, createOrUpdateWidget)
}

Освен това незначително подобрение - верижното обещание правилно ви се струва и изглежда, че то е правилно.