2012-02-22 12 views
18

मुझे पता है कि node.js. के लिए कई control flow libraries हैं उनमें से कुछ कॉलबैक (जैसे एसिंक, एसिंकब्लॉक, आदि) के साथ एक श्रृंखला एसिंक फ़ंक्शन देते हैं, अन्य promise concept (क्यू, स्थगित, वायदा इत्यादि) का उपयोग करते हैं। एक लंबे समय तक चलने वाली लिपि को एक दूसरे के बाद क्रियाओं की एक श्रृंखला बनाने के बाद जो किसी भी समय असफल हो सकता है, आप कौन सा नियंत्रण प्रवाह पसंद करेंगे और क्यों? पक्ष और विपक्ष क्या होते हैं?Node.js नियंत्रण प्रवाह: कॉलबैक या वादे?

उत्तर

5

मुझे नहीं लगता कि कई उद्देश्य पेशेवर और विपक्ष हैं। Async बहुत लोकप्रिय है (एनपीएम packages that depend on it पर आधारित)।

मुझे नियंत्रण प्रवाह पुस्तकालयों (विशेष रूप से async) पसंद है, क्योंकि यह समझना मेरे लिए आसान है। वादा मुझे भ्रमित करते हैं, जबकि एसिंक आसानी से समझ में आता है। मुझे संदेह है कि यह सिर्फ एक सीखने की अवस्था की बात है, और यदि मैं उन्हें सीखने में प्रयास करता हूं तो वादे अधिक पठनीय होंगे। लेकिन क्या मुझे उम्मीद है कि लोग मेरे कोड को पढ़ने की कोशिश कर रहे हैं?

एक तीसरा प्रकार भी है - Fibers। फाइबर अभी तक विंडोज पर काम नहीं करते हैं, लेकिन (आईएमओ) उन चीजों के लिए सबसे स्पष्ट वाक्यविन्यास प्रदान करता है जो श्रृंखला में निष्पादित होना चाहिए।

13

कॉलबैक के लिए सकारात्मक:

  • सरल को समझते हैं और बनाने के लिए।
  • कुछ हद तक अधिक कुशल, क्योंकि कम वस्तुओं को बनाया जाता है और कचरा इकट्ठा किया जाता है।
  • नोड ने (error,result) कॉलबैक का चयन किया। मैं स्थिरता के लिए उनके तर्क आदेश का पालन करने की सलाह देते हैं। वादों के लिए ((result1, result2, result3, error) कहना रूप में विरोध करने के लिए।)

सकारात्मक:

  • एक धाराप्रवाह इंटरफ़ेस, जो कभी कभी नेस्टेड कॉलबैक नरक को कम करने, shown here के रूप में मदद कर सकते हैं प्रदान करता है। कोड .then(foo).then(bar) कॉलों को चेन करके रैखिक रूप से प्रवाह में प्रतीत होता है।
  • एक अच्छा वादा लाइब्रेरी आपको समांतर में कई एसिंक्रोनस ऑपरेशंस चलाने देगी, और केवल तब ही जारी रहेगी जब वे पूरी हो जाएंगी। Deferred लाइब्रेरी map के माध्यम से यह निर्बाध रूप से करता है, क्यू में allResolved है, और ES6 वादे Promise.all() प्रदान करते हैं। (यह भी कॉलबैक के साथ संभव है, उदाहरण के लिए async.parallel() का उपयोग कर, लेकिन में नहीं बनाया गया।)
  • एक अच्छा वादे पुस्तकालय आप समारोह जो करता है, तो कतारबद्ध किसी भी कार्य के असफल बुलाया जाएगा निपटने एक त्रुटि निर्दिष्ट करने देगा। कॉलबैक के साथ ऐसा करने के लिए प्रत्येक कॉलबैक की शुरुआत में थोड़ा बॉयलरप्लेट की आवश्यकता होती है: if (err) return callback(err);

यह भावना ढेर की तल के पास कॉलबैक का उपयोग करने के, कोड जो प्रति सेकंड कई बार चलाया जाएगा के लिए होगा। ढेर के ऊपर, वादे बेहतर हो सकते हैं क्योंकि उन्हें पढ़ने और समझना आसान होता है, और त्रुटियों को और अधिक सुन्दर तरीके से संभाल सकता है।

यह ध्यान देने योग्य है कि वादे को कॉलबैक रनटाइम पर बनाया जा सकता है। तो आप कम से कम कॉलबैक फॉर्म में अपने कोर कोड को कार्यान्वित कर सकते हैं, और यदि आप चाहें तो लाइब्रेरी के वादे संस्करण का पर्दाफाश कर सकते हैं। (जैसा कि Q.nfbind() में है।)

मुझे अन्य पेशेवर/विपक्ष सुनने में दिलचस्पी होगी।

बोनस टिप: त्रुटियों को हमेशा संभाल लें! दोनों विधियों के साथ, यदि आप त्रुटि को संभाल नहीं पाते हैं तो यह आपको अंधेरे में छोड़ देगा, क्योंकि आपका कोड अपेक्षित रूप से क्यों काम नहीं करता है।

कॉलबैक हमेशा if (err) ... को संभालना चाहिए और यदि वे वापस नहीं आते हैं तो वादा हमेशा .catch() होना चाहिए।

भले ही आप कभी-कभी त्रुटियों की अपेक्षा करते हैं, और उनको संभालने की आवश्यकता नहीं है, अप्रत्याशित त्रुटियों को संभालने का मतलब नहीं है, यदि भविष्य में कोड बदल दिया गया है, तो आप टाइपर जैसे डेवलपर गलतियों से त्रुटियों के बारे में नहीं सुनेंगे।

वचनों के लिए .catch() का विकल्प unhandled rejections सुनना है। व्यक्तिगत रूप से मैं इस चेतावनी को जारी करने के लिए उपयोग करता हूं कि .catch() गुम था! उस पर ऐसा करने के लिए http://chainsjs.org अभी भी और अधिक काम है, लेकिन यह आप जहां काफी पूरी तरह से प्रवाह को नियंत्रित कर सकते हैं एक "निष्पादन नक्शा" को परिभाषित करने की क्षमता देता है:

+1

perfs के बारे में अधिक जानकारी: http://thanpol.as/javascript/promises-a-performance-hits-you-should-be-aware-of/ – Offirmo

+0

लिंक अब और काम नहीं करता – Shide

+1

यहां [एक संग्रहित प्रति ऑफर्मो का पेर्फ लिंक] (http://web.archive.org/web/20160522044854/http://thanpol.as/javascript/promises-a-performance-hits-you-should-be-aware-of)। – joeytwiddle

0

मैं इस पुस्तकालय के साथ एक कथात्मक दृष्टिकोण के साथ प्रयोग किया गया है एक साधारण मैपिंग से निष्पादन का।

+0

वह साइट आज नीचे थी लेकिन मुझे संग्रह में एक प्रतिलिपि मिली [http://web.archive.org/web/20141217011058/http://chainsjs.org/)। अन्य नियंत्रण प्रवाह पुस्तकालयों की एक सूची है [यहां] (https://github.com/joyent/node/wiki/modules#user-content-wiki-async-flow)। – joeytwiddle

+0

@joeytwiddle - नोट के लिए धन्यवाद, मैंने कभी भी आईपी को स्विच नहीं किया जब github पेज आईपी बदल गए। मैंने अभी DNS अपडेट किया है, इसे जल्द ही बैक अप लेना चाहिए। –

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