मान लीजिए कि आप एक पुस्तकालय बनाए रखते हैं जो एक फ़ंक्शन को उजागर करता है getData
। आपके उपयोगकर्ता इसे वास्तविक डेटा प्राप्त करने के लिए कहते हैं:
var output = getData();
हुड डेटा के तहत एक फ़ाइल में सहेजा जाता है ताकि आपने getData
Node.js अंतर्निहित का उपयोग करके कार्यान्वित किया fs.readFileSync
। यह दोनों स्पष्ट है getData
और fs.readFileSync
सिंक कार्य हैं। एक दिन आपको बताया गया था कि अंतर्निहित डेटा स्रोत को मोंगोडीबी जैसे रेपो में बदल दिया जाए जिसे केवल अतुल्यकालिक रूप से एक्सेस किया जा सकता है। आपको अपने उपयोगकर्ताओं को पेशाब करने से बचने के लिए भी कहा गया था, getData
केवल एक वादा वापस करने या कॉलबैक पैरामीटर की मांग करने के लिए एपीआई को नहीं बदला जा सकता है। आप दोनों आवश्यकताओं को कैसे पूरा करते हैं?
कॉलबैक / वादे का उपयोग करते हुए अतुल्यकालिक कार्य JavasSript और Node.js. का डीएनए है किसी भी गैर-तुच्छ जेएस एप्लिकेशन को शायद इस कोडिंग शैली के साथ अनुमति दी जाती है। लेकिन यह अभ्यास आसानी से तथाकथित कॉलबैक पिरामिड को जन्म दे सकता है। इससे भी बदतर, अगर कॉल श्रृंखला में किसी भी कॉलर में कोई भी कोड async फ़ंक्शन के परिणाम पर निर्भर करता है, तो उन कोड को कॉलबैक फ़ंक्शन में भी लपेटना पड़ता है, साथ ही कॉलर पर एक कोडिंग शैली की बाधा भी होती है। समय-समय पर मुझे बड़े पैमाने पर वैश्विक पुन: फैक्टरिंग से बचने के लिए एक सिंक फ़ंक्शन में एक async फ़ंक्शन (अक्सर एक 3 पार्टी लाइब्रेरी में प्रदान किया गया) को इनकैप्सुलेट करने की आवश्यकता मिलती है। इस विषय पर समाधान की खोज आमतौर पर नोड फाइबर्स के साथ समाप्त हुईया npm संकुल इससे प्राप्त होता है। लेकिन फाइबर सिर्फ उस समस्या को हल नहीं कर सकते हैं जिसका मैं सामना कर रहा हूं। यहां तक कि फाइबर्स लेखक द्वारा प्रदान किए गए उदाहरण ने कमी को चित्रित किया:
...
Fiber(function() {
console.log('wait... ' + new Date);
sleep(1000);
console.log('ok... ' + new Date);
}).run();
console.log('back in main');
वास्तविक उत्पादन:
wait... Fri Jan 21 2011 22:42:04 GMT+0900 (JST)
back in main
ok... Fri Jan 21 2011 22:42:05 GMT+0900 (JST)
यदि फ़ंक्शन फाइबर वास्तव में async फ़ंक्शन नींद को सिंक में बदल देता है, तो आउटपुट होना चाहिए:
wait... Fri Jan 21 2011 22:42:04 GMT+0900 (JST)
ok... Fri Jan 21 2011 22:42:05 GMT+0900 (JST)
back in main
मैंने JSFiddle में एक और सरल उदाहरण बनाया है और अपेक्षित उत्पादन प्राप्त करने के लिए कोड की तलाश कर रहा हूं । मैं एक समाधान स्वीकार करूंगा जो केवल Node.js में काम करता है इसलिए आप JSFiddle में काम नहीं करने के बावजूद किसी भी npm पैकेज की आवश्यकता के लिए स्वतंत्र हैं।