दिलचस्प पोस्ट
एएस 3 में ईवेंट श्रोता के लिए एक पैरामीटर को सरल तरीके से पास करने के लिए … क्या यह मौजूद है? index.php डिफ़ॉल्ट रूप से लोड नहीं है व्यापक शुरुआत virtualenv ट्यूटोरियल? एक HTML चयन तत्व का चयनित विकल्प बदलना कैसे "बिल्ली << EOF" bash में काम करता है? 32 बिट पूर्णांक के साथ कम टक्कर दर के साथ फास्ट स्ट्रिंग हैशिंग एल्गोरिथम मैं दृश्य स्टूडियो में स्टैक ट्रेस कैसे खोजूं? फ्यूचर / फ़ैक्टर / एपटेक्टिव / मोनाद के अच्छे उदाहरण नहीं हैं? एक सूची को जावा में एक सेट में परिवर्तित करने का सबसे आसान तरीका मैं रैंड () के साथ यादृच्छिक संख्याओं का एक ही क्रम क्यों प्राप्त करता हूं? एक फ्लोट बनाओ केवल दो दशमलव स्थान दिखाएं मैं जावास्क्रिप्ट के साथ कैसे पुनर्निर्देशित करूं? node.js, SSL के साथ socket.io घटना जब window.location.href में परिवर्तन एंड्रॉइड पर दो तरह प्रमाणन SSL सॉकेट के लिए क्लाइंट / सर्वर प्रमाणपत्र का उपयोग करना

जावास्क्रिप्ट, नोड। जेएस: है Array.for हर एसिंक्रोनस?

मेरे पास मूल Array.forEach के बारे में कोई सवाल है। जावास्क्रिप्ट के Array.forEach कार्यान्वयन के लिए: क्या यह एसिंक्रोनस व्यवहार करता है? उदाहरण के लिए, अगर मैं कॉल करता हूं:

 [many many elements].forEach(function () {lots of work to do}) 

क्या यह गैर-अवरुद्ध होगा?

वेब के समाधान से एकत्रित समाधान "जावास्क्रिप्ट, नोड। जेएस: है Array.for हर एसिंक्रोनस?"

नहीं, यह अवरुद्ध है एल्गोरिथ्म के विनिर्देश पर एक नज़र डालें

हालांकि कार्यान्वयन को समझने में शायद आसान एमडीएन पर दिया गया है:

 if (!Array.prototype.forEach) { Array.prototype.forEach = function(fun /*, thisp */) { "use strict"; if (this === void 0 || this === null) throw new TypeError(); var t = Object(this); var len = t.length >>> 0; if (typeof fun !== "function") throw new TypeError(); var thisp = arguments[1]; for (var i = 0; i < len; i++) { if (i in t) fun.call(thisp, t[i], i, t); } }; } 

यदि आपको प्रत्येक तत्व के लिए बहुत से कोड निष्पादित करना है, तो आपको एक अलग दृष्टिकोण का उपयोग करने पर विचार करना चाहिए:

 function processArray(items, process) { var todo = items.concat(); setTimeout(function() { process(todo.shift()); if(todo.length > 0) { setTimeout(arguments.callee, 25); } }, 25); } 

और उसके बाद इसे कॉल करें:

 processArray([many many elements], function () {lots of work to do}); 

यह फिर से अवरुद्ध होगा। उदाहरण उच्च प्रदर्शन जावास्क्रिप्ट से लिया जाता है।

एक अन्य विकल्प वेब कर्मचारी हो सकता है

अगर आपको एरेन्कोनस-फ्रेंडली वर्जन का अरा। के लिए आवश्यक है, तो प्रत्येक नोड। जेएस 'async' मॉड्यूल में उपलब्ध हैं: http://github.com/caolan/async … बोनस के रूप में यह मॉड्यूल भी काम करता है ब्राउज़र में

 async.each(openFiles, saveFile, function(err){ // if any of the saves produced an error, err would equal that error }); 

नोड में वास्तव में भारी गणना करने के लिए एक आम पैटर्न है जो आपके लिए लागू हो सकता है …

नोड एकल-थ्रेडेड है (एक जानबूझकर डिज़ाइन पसंद के रूप में देखें, नोड। जेएस क्या है? ); इसका मतलब यह है कि यह केवल एक कोर का उपयोग कर सकता है आधुनिक बक्से में 8, 16 या अधिक कोर हैं, इसलिए ये मशीन बेकार की 90%% छोड़ सकता है। एक आरईएसटी सेवा के लिए आम पैटर्न एक कोर नोड प्रक्रिया को हर कोर में आग लगाना है, और इन्हें स्थानीय लोड बैलेंसर के पीछे http://nginx.org/ जैसे रख दिया गया है।

एक बच्चे को फोर्क करना – आप जो भी करने की कोशिश कर रहे हैं, एक और आम पैटर्न है, भारी भार उठाने के लिए बाल प्रक्रिया को फांकाने के लिए। उल्टा यह है कि बच्चे की प्रक्रिया पृष्ठभूमि में भारी गणना कर सकती है, जबकि आपकी मूल प्रक्रिया अन्य घटनाओं के लिए उत्तरदायी है। पकड़ यह है कि आप इस बच्चे की प्रक्रिया के साथ स्मृति साझा नहीं कर सकते / नहीं कर सकते हैं (बहुत सारे contortions और कुछ देशी कोड के बिना); आपको संदेश पास करना होगा यह खूबसूरती से काम करेगा यदि आपके इनपुट और आउटपुट डेटा का आकार उस गणना के मुकाबले छोटा है जो प्रदर्शन किया जाना चाहिए। आप एक बच्चा नोड। जेएस प्रक्रिया को भी आग लगा सकते हैं और उसी कोड का उपयोग कर सकते हैं जो आप पहले से उपयोग कर रहे थे।

उदाहरण के लिए:

 var child_process = की आवश्यकता होती है ('child_process');
 समारोह run_in_child (सरणी, सीबी) {
     var प्रक्रिया = child_process.exec ('नोड libfn.js', फ़ंक्शन (त्रुटि, stdout, stderr) {
         var आउटपुट = जेएसओएन.पार्स (स्टडआउट);
         सीबी (त्रुटि, आउटपुट);
     });
     process.stdin.write (JSON.stringify (सरणी), 'utf8');
     process.stdin.end ();
 }

Array.forEach चीजें कंप्यूटिंग के लिए इंतजार नहीं कर रही है, और इवेंट लूप में अतुल्यकालिक कम्प्यूटिंग बनाने के लिए कुछ भी नहीं है (वेबवर्कर्स मल्टिप्रोकसेसिंग जोड़ते हैं, अगर आपको बहु-कोर कंप्यूटेशन की आवश्यकता होती है)। यदि आप कई कार्यों को समाप्त करने के लिए इंतजार करना चाहते हैं, तो काउंटर का उपयोग करें, जिसे आप सैकॉयर वर्ग में लपेट कर सकते हैं।

ऐसा इसलिए है कि मैं es7 के बारे में उत्साहित हूं, भविष्य में आप नीचे दिए गए कोड की तरह कुछ कर सकेंगे (कुछ चश्मा पूर्ण नहीं हैं, सावधानी के साथ उपयोग करते हैं, मैं इसे अद्यतित रखने की कोशिश करूंगा)। लेकिन मूल रूप से नया :: बाइंड ऑपरेटर का उपयोग करके, आप ऑब्जेक्ट पर एक विधि चलाने के लिए सक्षम होंगे जैसे ऑब्जेक्ट के प्रोटोटाइप में विधि शामिल है। जैसे [ऑब्जेक्ट] :: [पद्धति] जहां आप आमतौर पर [ऑब्जेक्ट] कहेंगे। [ऑब्जेक्ट्समिशन]

आज (24 जुलाई -16) ऐसा करने के लिए नोट करें और इसे सभी ब्राउज़रों में काम करें, जिनकी आपको निम्नलिखित कार्यक्षमता के लिए अपने कोड को पारित करना होगा: आयात / निर्यात , एरो फ़ंक्शंस , वादे , एसिंक / प्रतीक्षारत और सबसे महत्वपूर्ण कार्य बाँध । नीचे दिए गए कोड को केवल फ़िल्ट बाइंड का उपयोग करने के लिए संशोधित किया जा सकता है यदि नेज़ेरीरी, यह सब कार्यक्षमता आज भी बीएबल का उपयोग करके सुव्यवस्थित रूप से उपलब्ध है।

YourCode.js (जहां ' बहुत सारे काम करने के लिए ' एक वादे वापस करना चाहिए, इसे हल करने पर असिंक्रोनस काम किया जाता है।)

 import { asyncForEach } from './ArrayExtensions.js'; await [many many elements]::asyncForEach(() => lots of work to do); 

ArrayExtensions.js

 export function asyncForEach(callback) { return Promise.resolve(this).then(async (ar) => { for(let i=0;i<ar.length;i++) { await callback.call(ar, ar[i], i, ar); } }); }; export function asyncMap(callback) { return Promise.resolve(this).then(async (ar) => { const out = []; for(let i=0;i<ar.length;i++) { out[i] = await callback.call(ar, ar[i], i, ar); } return out; }); }; 

तीसरे पक्ष के लिब्स की आवश्यकता के बिना उपयोग करने के लिए यह एक छोटा अतुल्यकालिक कार्य है

 Array.prototype.each = function (iterator, callback) { var iterate = function () { pointer++; if (pointer >= this.length) { callback(); return; } iterator.call(iterator, this[pointer], iterate, pointer); }.bind(this), pointer = -1; iterate(this); }; 

प्रत्येक लूप के लिए आसान एसिंक्रोनस के लिए एनपीएम पर एक पैकेज है ।

 var forEachAsync = require('futures').forEachAsync; // waits for one request to finish before beginning the next forEachAsync(['dogs', 'cats', 'octocats'], function (next, element, index, array) { getPics(element, next); // then after all of the elements have been handled // the final callback fires to let you know it's all done }).then(function () { console.log('All requests have finished'); }); 

इसके अलावा एक अन्य बदलाव AllAsync के लिए

उदाहरण के लिए इस तरह के समाधान को भी कोड करना संभव है:

  var loop = function(i, data, callback) { if (i < data.length) { //TODO("SELECT * FROM stackoverflowUsers;", function(res) { //data[i].meta = res; console.log(i, data[i].title); return loop(i+1, data, errors, callback); //}); } else { return callback(data); } }; loop(0, [{"title": "hello"}, {"title": "world"}], function(data) { console.log("DONE\n"+data); }); 

दूसरी ओर, यह "के लिए" से बहुत धीमी है

अन्यथा, उत्कृष्ट एसिंक पुस्तकालय ऐसा कर सकता है: https://caolan.github.io/async/docs.html#each