/ / Secuela correctamente ejecutando múltiples creaciones + actualizaciones - promesa, sequelize.js

Secuela correctamente ejecutando múltiples creaciones + actualizaciones - promesa, sequelize.js

Tengo un trabajo cron que raspa una lista de elementos enun sitio web y luego inserta o actualiza registros en una base de datos. Cuando rasco la página, quiero crear registros para los nuevos que aún no se han creado, de lo contrario actualizaré los existentes. Actualmente estoy haciendo algo como esto:

// 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!");
});

Esto parece funcionar bien, pero no estoy seguro de sihaciendo esto "correctamente" o no. ¿Todas las promesas que realizan interacciones de DB deben ejecutarse en serie, o es así como las he definido bien? ¿Hay una mejor manera de hacer este tipo de cosas?

Respuestas

6 para la respuesta № 1

Lo que estás haciendo es bastante idiomático y está perfectamente bien, la única forma de mejorar es utilizar el hecho de que Sequelize usa Bluebird como promesa para que obtengas .map de forma gratuita, lo que le permite convertir:

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

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

return Sequelize.Promise.all(promises);
}

Dentro:

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

Aparte de esa pequeña mejora, estás encadenando las promesas correctamente y parece que tienes el problema correcto.