2011-03-20 13 views
17

नोडज में सबकुछ गैर-अवरुद्ध है जो अच्छा है, लेकिन मैं कॉलबैक की एक बड़ी घोंसला वाली सूची के बिना दूसरे के बाद एक समारोह होने के बारे में कैसे जाउंगा?नोडजेज़ में "अवरुद्ध" कोड लिखना

+2

नोड.जेएस गैर-अवरुद्ध कोड के लिए है। आप प्रवाह के खिलाफ जा रहे हैं और इसे अवरुद्ध करने की कोशिश करके अस्तित्व के बहुत ही उद्देश्य को हरा रहे हैं। –

उत्तर

12

आप अपने कॉलबैक घोंसला करते हैं।

एसिंक्रोनस कोड लिखने में कई पैटर्न हैं।

उदाहरण के लिए

, इस matrioska-नेस्टेड शैली ...

database.find('foo', function (err, data) { 
    database.update('foo', 'bar', function (err, data) { 
    database.delete('bar', function (err, data) { 
     console.log(data); 
    }); 
    }); 
}); 

... एक क्लीनर में लिखा जा सकता है (लेकिन अधिक शब्द) रास्ता:

var onDelete = function (err, data) { 
     console.log(data); 
    }, 

    onUpdate = function (err, data) { 
     database.delete('bar', onDelete); 
    }, 

    onFind = function (err, data) { 
     database.update('foo', 'bar', onUpdate); 
    }; 

database.find('foo', onFind); 

एक अन्य विकल्प का उपयोग कर रहा है कॉलबैक के सार धारावाहिक और समांतर निष्पादन के लिए एक मॉड्यूल।

+1

जिस पैटर्न के साथ मैं सफल रहा हूं वह एक वादा पुस्तकालय का उपयोग कर रहा है, जैसे ब्लूबर्ड: https: //github.com/petkaantonov/bluebird/blob/master/API.md#promisification और मैं जिस पैटर्न का उपयोग करता हूं (जैसे मासिलम कहते हैं) निम्नलिखित लेख में "रूकी मिस्टके 1" के तहत सुझाए गए एक है: http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html –

8

UseStep

यह "नोड.जेएस के लिए एक सरल नियंत्रण-प्रवाह लाइब्रेरी है जो समानांतर निष्पादन, धारावाहिक निष्पादन, और दर्द रहित दर्द को निष्क्रिय करता है"।

+0

-1 यह कोई जवाब नहीं है। यह सिर्फ एक लिंक है। – Raynos

+5

+1 यह एक उत्तर है, यद्यपि संक्षेप में, हालांकि मैं नियंत्रण प्रवाह पुस्तकालयों की पूरी सूची को इंगित कर सकता हूं https://github.com/joyent/node/wiki/modules#wiki-async-flow – talentedmrjones

+3

@ खेतान: एक लिंक ठीक है, लेकिन आपको यह जानने के लिए लिंक पर क्लिक करने की आवश्यकता नहीं है कि आपका क्या मतलब है। लिंक का एक संक्षिप्त विवरण यहां होना चाहिए –

2

आप वास्तव में क्या करना चाहते हैं यह पता लगाना है कि आपके ऑपरेशन क्यों अवरुद्ध हो रहे हैं और उन्हें रिकोड क्यों कर रहे हैं ताकि वे गैर-अवरुद्ध हो जाएं। एक दूसरे पर निर्भरताओं को हटा दें। आपको गैर-अवरुद्ध आईओ के बारे में सोचने के तरीके को बदलने की जरूरत है।

लाइब्रेरी का उपयोग करके आप इस प्रकार के कोड को सिंक्रोनस अवरुद्ध तरीके से चलाने की अनुमति देने के लिए केवल एक खराब क्रैच है।

नोड.जेएस में गैर अवरोधन कोड लिखने के तरीके सीखने से आप काफी बेहतर होंगे क्योंकि यह वही है जो इसे करने के लिए डिज़ाइन किया गया है।

1

async module एक विशेष रूप से अच्छा समाधान है - इसका उपयोग करके बहुत अधिक घुलनशील घोंसले के साथ बहुत साफ एसिंक्रोनस कोड होता है। आप के माध्यम से इसे प्राप्त कर सकते हैं:

  • async.series:

    npm install async --save 
    

    विशेष रूप से पर एक नज़र डालें यह आप एक के बाद एक को चलाने के लिए कार्यों की एक सूची सेट करने देता है - जहां प्रत्येक में सूची पूरी होने से पहले ही चलती है। हालांकि, अन्य कोड (परिभाषित श्रृंखला के बाहर) अवरुद्ध किए बिना चला सकते हैं।

  • async.series: यह async.series के समान है, सूची में प्रत्येक फ़ंक्शन सूची में अगला परिणाम पास करता है, अंतिम परिणाम अंत में परिभाषित कॉलबैक को पास किया जाता है।

हालांकि, async's control flow-specific methods सभी नेस्टेड कॉलबैक सूचियों से बचने के लिए बहुत उपयोगी हैं।

इसके अलावा, यह मदद करता है अगर, here's a jsFiddle I put together जब पुस्तकालय सीखने, async.series के लिए async.waterfall & किसी अन्य के लिए एक (कंसोल खोलें देखने के लिए यह क्या कर रही है) सहित उदाहरण के एक सेट से युक्त।

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