2014-11-09 2 views
7

У меня есть задание cron, которое сбрасывает список элементов на веб-сайте, а затем вставляет или обновляет записи в базе данных. Когда я очищаю страницу, я хочу создать записи для новых, которые еще не были созданы, иначе обновите существующие. В настоящее время я делаю что-то вроде этого:Sequelize правильно выполнение нескольких создает + обновления

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

Это, кажется, работает хорошо, но я не уверен, если я делаю это «правильно» или нет. Все обещания, которые выполняют взаимодействия с БД, нужно запускать поочередно или как я их определяю? Есть ли лучший способ сделать это?

+0

Благодарим вас за логику. Борясь с этим. – Craicerjack

ответ

6

Что вы делаете довольно идиоматических и прекрасно, единственное место для совершенствования, чтобы использовать тот факт, 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) 
} 

кроме этого незначительного улучшения - вы правильно цепочки обещаний и, кажется, правильно повесить его.

+0

С точки зрения взаимодействия с базой данных, все эти отдельные «параллельные» обещания «безопасны»? В отличие от маргаритной цепочки их серийным способом. – chinabuffet

+0

@chinabuffet Да, у вас нет гарантии на исполнение, хотя это можно выполнить перед другим. Если вы хотите связать их в последовательный вопрос, вы можете обменять 'Promise.map' на' Promise.each', но я не думаю, что в этом случае было бы важно, так как обновления не связаны. –

Смежные вопросы