2014-11-09 11 views
7

Ho un processo cron che cancella un elenco di elementi su un sito Web e quindi inserisce o aggiorna i record in un database. Quando scrivo la pagina, voglio creare record per quelli nuovi che non sono stati ancora creati, altrimenti aggiorna quelli esistenti. Attualmente sto facendo qualcosa di simile:Sequenziare correttamente l'esecuzione di più crea + aggiornamenti

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

Questo sembra funzionare bene, ma non sono sicuro se sto facendo questo "correttamente" o no. Tutte le promesse che eseguono le interazioni DB devono essere eseguite in serie o è come le ho definite ok? C'è un modo migliore per fare questo genere di cose?

+0

Grazie per la logica da solo. Lottando con questo. – Craicerjack

risposta

6

Quello che stai facendo è abbastanza idiomatica e perfettamente soddisfacente, l'unico margine di miglioramento è quello di utilizzare il fatto Sequelize utilizza Bluebird per promesse in modo da ottenere .map gratuitamente, che permette di convertire:

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

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

    return Sequelize.Promise.all(promises); 
} 

Into:

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

oltre a questo miglioramento minore - si sta concatenamento promesse correttamente e sembrano avere la corretta blocco di esso.

+0

In termini di interazione con il database, stanno avendo tutte queste promesse "parallele" separate "sicure"? A differenza di Daisy che li lega in modo seriale. – chinabuffet

+0

@chinabuffet sì, non si ha alcuna garanzia sull'ordine di esecuzione, che è possibile eseguire prima dell'altro. Se desideri associarli a un argomento sequenziale, puoi scambiare "Promise.map" per "Promise.each", ma non penso che in questo caso sia molto importante in quanto gli aggiornamenti non sono correlati. –

Problemi correlati