2012-10-06 13 views
21

क्या मैं नोडिड्स मैपिंग पर भरोसा कर सकता हूं हर बार पूरा किया जाता है कुछ() कहा जाता है?क्या Node.js Array.map() asynchronous है?

nodeIDs = $.map(nodeIDs, function(n){ 
    return n.match(/\d+$/); 
}); 
doSomething(nodeIDs); 

मैंने सोचा कि node.js में सभी कॉलबैक असीमित हैं? मैंने सामान्य प्रोग्रामिंग पर एक लेख पढ़ा था कि कॉलबैक तुल्यकालिक हो सकता है लेकिन मुझे node.js के बारे में निश्चित नहीं है?

+0

यहां $ क्या है? नक्शा सूची के प्रत्येक सदस्य पर लागू करने के लिए कॉलबैक फ़ंक्शन लेता है, पूर्ण पुनरावृत्ति पूर्ण होने पर कॉलबैक नहीं होता है। – chovy

+0

धन्यवाद chovy।$ के लिए, मैं सिर्फ नोड-jquery मॉड्यूल के साथ प्रयोग कर रहा था और इसे संपादित करने के लिए परेशान नहीं किया था। – bonchef

उत्तर

32

जावास्क्रिप्ट भी एक कार्यात्मक प्रोग्रामिंग भाषा है। आपके पास यहां एक «उच्च आदेश फ़ंक्शन» है, एक फ़ंक्शन जो पैरामीटर के रूप में कार्य करता है। उच्च आदेश फ़ंक्शन तुल्यकालिक होते हैं (लेकिन नीचे नोट देखें)।

सूत्रों का कहना है:

map() एक उच्च आदेश समारोह का एक विशिष्ट उदाहरण है। यह एक फ़ंक्शन लेता है और इसे किसी सरणी के सभी तत्वों पर लागू करता है। परिभाषा बहुत «कार्यात्मक» लगता है। यह कार्य नोड द्वारा भी प्रदान नहीं किया जाता है। इसे MDN Array.prototype.map() द्वारा दस्तावेज किया गया है और ECMAScript 5.1 द्वारा निर्दिष्ट किया गया है।

अपने प्रश्न का उत्तर देने के लिए: हाँ, doSomething(nodeIDs) के बाद सभी तत्व लागू किए गए हैं।


नोट: उच्च आदेश फ़ंक्शन कार्यात्मक प्रोग्रामिंग की अवधारणा है। जावास्क्रिप्ट कार्यात्मक है, लेकिन ब्राउज़र या सर्वर के अंदर कोड निष्पादित करने की व्यावहारिकता में भी गहराई से बैठता है। मैं कहूंगा कि उदाहरण के लिए setTimeout() उच्च ऑर्डर फ़ंक्शन नहीं है, भले ही यह पैरामीटर के रूप में कार्य करता है क्योंकि setTimeout() वास्तव में पूरी तरह कार्यात्मक नहीं है क्योंकि यह समय का उपयोग करता है। शुद्ध कार्यक्षमता कालातीत है। उदाहरण के लिए map() का परिणाम समय पर निर्भर नहीं है। और यही वह सवाल है जो वास्तव में है। अगर कुछ समय पर निर्भर नहीं करता है तो आप इसे समकालिक रूप से निष्पादित करते हैं। समस्या सुलझ गयी।

जावास्क्रिप्ट में उच्च आदेश फ़ंक्शन की परिभाषा को चुनौती देने के लिए साइमन के लिए धन्यवाद।

+0

धन्यवाद nalply। मानचित्र() के संदर्भ कार्यान्वयन को देखते हुए मदद करता है। – bonchef

+0

* उच्च आदेश कार्य तुल्यकालिक * हैं - वास्तव में? सेटटाइमआउट भी एक उच्च-आदेश समारोह है, लेकिन यह असीमित है। –

+0

@ साइमनए.इगस्टर आपके पास एक बिंदु है। यदि आप कार्यों को कड़ाई से परिभाषित करते हैं जो पैरामीटर के रूप में कार्यों को «उच्च आदेश» के रूप में लेते हैं तो असीमित कार्य भी «उच्च आदेश» होते हैं। आप सिंक्रोनस फ़ंक्शन को कॉल करेंगे जो पैरामीटर के रूप में कार्य करते हैं? – nalply

0

यह फ़ंक्शन तुल्यकालिक है - अन्यथा यह मानचित्र संचालन के परिणाम को वापस नहीं कर सका।

कोई भी कॉलबैक जो अधिक समय ले सकता है (मुख्य रूप से आईओ के कारण) नोडज में असीमित है - जब तक कि विधि को सिंक्रोनस (जैसे fs.readFileSync) के रूप में स्पष्ट रूप से चिह्नित किया जाता है - लेकिन यह कॉलबैक का उपयोग नहीं करता है)। आप शायद किसी भी तरह उलझन में हैं।

+0

धन्यवाद ThiefMaster। मैं आईओ कार्यों के सिंक और असिंक संस्करणों के हिस्से को समझता हूं और अतीत में दोनों का उपयोग करता हूं। मेरे प्रश्न को फिर से वाक्यांशित करने के लिए: कोड का एक सेगमेंट दिया गया, जब कोई कॉलबैक नहीं होता है, तो मैं तुल्यकालिक प्रवाह मान सकता हूं। लेकिन जब कॉलबैक होते हैं, तो एक तरफ या दूसरे की पुष्टि करने का कोई स्पष्ट तरीका नहीं है? यदि आईओ शामिल हैं तो वे एसिंक हैं। लेकिन मानचित्र() मामले में मैं इतना निश्चित नहीं था - न तो नोडज और न ही जावास्क्रिप्ट संदर्भ यह निर्दिष्ट करते हैं। तो मैं अगले पुस्तकालय समारोह के लिए कैसे कह सकता हूं? – bonchef

+0

दस्तावेज़ इसे बताते हैं। जैसे http://nodejs.org/api/fs.html#fs_fs_rename_oldpath_newpath_callback "एसिंक्रोनस नाम बदलें" – ThiefMaster

11

हां, .map तुल्यकालिक है। "कॉलबैक" "असीमित" का अर्थ नहीं है।

+1

धन्यवाद चर्मंडर। मेरा कहना था कि 'जब संदेह होता है, तो मान लें कि कॉलबैक को अलग-अलग समय पर असीमित रूप से कहा जा सकता है।' तो वास्तविक सवाल यह है (ऊपर मेरी टिप्पणियां देखें) - आम तौर पर मैं कैसे बता सकता हूं कि दिया गया लाइब्रेरी फ़ंक्शन एसिंक है या नहीं? – bonchef

+0

उदाहरण के लिए node.js फ़ाइल फ़ंक्शंस अच्छी तरह से प्रलेखित हैं, लेकिन अन्य, जैसे कि सर मैपिंग I को इस विशेष जानकारी का विवरण नहीं मिल रहा है। – bonchef

+0

ऐसा इसलिए है क्योंकि वे नोड द्वारा प्रदान नहीं किए जाते हैं। वे वी 8 रनटाइम से संबंधित हैं। वी 8 ईसीएमएस्क्रिप्ट लागू करता है। 'Array.map()' यहां प्रलेखित है: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/map। – nalply

3

async मॉड्यूल आयात एक अतुल्यकालिक 'map' विधि

var async = require('async'); 

var arr = ['1','2']; 
async.map(arr, getInfo, function (e, r) { 
    console.log(r); 
}); 

function getInfo(name, callback) { 
    setTimeout(function() { 
    callback(null, name + 'new'); 
    }, 1000); 
} 
-1

वहाँ उपयोगी lib awaiting है है। और map आपकी मदद करेगा।

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