/ / Sequelize corretamente executando várias cria + atualizações - promet, sequelize.js

Sequelize corretamente executando várias criações + atualizações - prometa, sequelize.js

Eu tenho um trabalho cron que raspa uma lista de itens emum site e, em seguida, insere ou atualiza registros em um banco de dados. Quando eu raspo a página, eu quero criar registros para novos que ainda não foram criados, caso contrário, atualizar quaisquer existentes. Atualmente estou fazendo algo como isto:

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

Isso parece funcionar bem, mas eu não tenho certeza se eu soufazendo isso "corretamente" ou não. Todas as promessas que realizam interações com o banco de dados precisam ser executadas em série, ou é como eu as defini ok? Existe uma maneira melhor de fazer esse tipo de coisa?

Respostas:

6 para resposta № 1

O que você está fazendo é bastante idiomático e perfeitamente bem, o único espaço para melhorias é utilizar o fato de o Sequelize usar o Bluebird para promessas. .map de graça, que permite converter:

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

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

return Sequelize.Promise.all(promises);
}

Para dentro:

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

Além dessa pequena melhora - você está encadeando as promessas corretamente e parece ter o jeito certo.