2014-11-09 8 views
7

मेरे पास एक क्रॉन जॉब है जो किसी वेबसाइट पर आइटम्स की एक सूची स्क्रैप करता है और फिर डेटाबेस में रिकॉर्ड्स दर्ज करता है या अपडेट करता है। जब मैं पृष्ठ को स्क्रैप करता हूं, तो मैं उन नए लोगों के लिए रिकॉर्ड बनाना चाहता हूं जो अभी तक नहीं बनाए गए हैं, अन्यथा किसी भी मौजूदा अपडेट को अपडेट करें। वर्तमान में मैं कुछ इस तरह कर रहा हूँ:कई रचनाओं को सही ढंग से निष्पादित करने के लिए सीक्वेलिज़ करें + अपडेट

// 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

@ चाइनाबफेट हां, आपके पास निष्पादन आदेश पर कोई गारंटी नहीं है - यह एक दूसरे के सामने निष्पादित हो सकता है। यदि आप उन्हें अनुक्रमिक मामले में श्रृंखलाबद्ध करना चाहते हैं, तो आप 'Promise.each' के लिए 'Promise.map' को स्वैप कर सकते हैं लेकिन मुझे नहीं लगता कि इससे इस मामले में बहुत अधिक मायने रखता है क्योंकि अपडेट संबंधित नहीं हैं। –

संबंधित मुद्दे