2013-02-28 7 views
14

पर विचार करें निम्नलिखित समारोह निष्पादित किया जा रहा,क्या जावास्क्रिप्ट एसिंक्रोनस कार्य करता है?

function loadPage() 
{ 
    takeInput(); 
    processInput(); 
    outputInput(); 
} 

किस क्रम में उन्हें फांसी दे दी हैं (मैं read है कि यह ढेर इस प्रकार है इसलिए विकल्प 2 जवाब हो जाएगा)?

विकल्प # 1

  1. takeInput();
  2. processInput();
  3. outputInput();

विकल्प # 2

  1. outputInput();
  2. processInput();
  3. टेकइनपुट();

उत्तर

16

जावास्क्रिप्ट कार्यों नहीं अतुल्यकालिक कर रहे हैं।

addEventListener, setTimeout, setInterval: कार्यों में से कुछ बहुत ही सीमित सेट एक अतुल्यकालिक एपीआई की है। ये केवल 3 हैं (जो मैंने सोचा था कि बहुत आश्चर्यजनक था)।

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

जावास्क्रिप्ट एक घटना लूप है। इवेंट लूप प्रत्येक ईवेंट को तब तक संसाधित करता है जब यह आता है। यदि आप 3 बार बटन पर क्लिक करते हैं और फिर एक टाइमर समाप्त हो जाता है तो ईवेंट भी प्रबंधित किए जाने वाले ऑर्डर भी होंगे। यह सब बहुत अच्छी तरह से परिभाषित और निर्धारित है।

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

+4

केवल 3? क्या, ठीक है, अन्य सभी के बारे में क्या? – Pointy

+1

कौन सा अन्य? कोई अन्य नहीं हैं। एक ऑनक्लिक या ऑनरस्टेस्टेन्चेंज (उदाहरण के लिए) असाइन करना केवल 'addEventListener' का एक बेस्टर्डिज़ेशन है। – Halcyon

+2

एक्सएचआर के बारे में क्या? Node.js में उपलब्ध सभी एपीआई के बारे में क्या? – Pointy

0

नहीं, डिफ़ॉल्ट रूप से/मानक के रूप में नहीं, हालांकि असीमित तरीके हैं। और jQuery एसिंक्रोनस व्यवहार का अधिक उपयोग करता है। लेकिन प्रत्येक मामले में, यह व्यक्तिपरक है, और यह नहीं कहा जा सकता है कि "सभी जावास्क्रिप्ट यह या है कि"।

विधियों को हमेशा क्रम में निष्पादित किया जाता है; उनमें से अतुल्यकालिकता का अर्थ है कि कोई भी दूसरे के सामने पूरा हो सकता है, भले ही बाद में बुलाया जाए।

8

क्या जावास्क्रिप्ट एसिंक्रोनस कार्य करता है?

कुछ हैं, अधिकतर नहीं हैं।

किस क्रम में वे

वे वे किस क्रम में कहा जाता है में निष्पादित किया जाएगा निष्पादित किया जाएगा। चूंकि वे सभी एक ही कार्य से बुलाए जाते हैं, यह एक साधारण रैखिक क्रम में होगा।

यदि उनमें से कोई एक असीमित तरीके से लिखा गया है, तो हो सकता है कि वे अपनी सभी गतिविधियों को उसी क्रम में पूरा न करें। example के लिए:

function a() { 
    console.log('a'); 
} 
function b() { 
    console.log('b'); 
} 
function c() { 
    console.log('c'); 
} 
function aAsync() { 
    setTimeout(a, 500); 
} 

function load() { 
    aAsync(); 
    b(); 
    c(); 
} 
load(); 
+1

तो सी() हमेशा बी() को पूरा करने की प्रतीक्षा करेगा जब तक कि बी में सभी कोड तुल्यकालिक हो? तो बी में सिंक्रोनस कोड की 1000 लाइनें हो सकती हैं और सी अभी भी बी के बाद निष्पादित की जाएगी? बस यह सुनिश्चित करना ^^ – Vincent

+0

अच्छा उदाहरण है कि जब कोड मूल कार्यों के अंदर असीमित होता है तो संचालन के क्रम को हाइलाइट करता है। यदि हम बी, सी के अंदर एसिंक कोड जोड़ना शुरू करते हैं तो एक कचरागृह होगा। इसके द्वारा, हमें वादा का उपयोग करना चाहिए: डी –

1

जावास्क्रिप्ट नहीं, आम तौर पर अतुल्यकालिक है, लेकिन यह अतुल्यकालिक और कार्यक्रम चालित तरीकों करता है।

अजाक्स कॉल बड़ी असीमित प्रक्रियाएं हैं।

घटनाओं के लिए, मुझे यकीन नहीं है कि आपको निष्पादन के आदेश के बारे में गारंटी दी जा सकती है, लेकिन मैं इसके बारे में गलत हो सकता हूं।

0

जावास्क्रिप्ट एक सिंगल थ्रेडेड जानवर है, इसलिए सख्ती से बोलने वाले कार्य असीमित नहीं हैं क्योंकि कोई कोड निष्पादित करने के लिए बाल धागे को बढ़ाने के मामले में सोच सकता है। यह तंत्र जो इसे प्रदान करता है, एसिंक्रोनिसिटी का भ्रम पैदा करता है, लेकिन यह अभी भी एकल-थ्रेडेड है।

+1

असीमित! = समानांतर – Quentin

1

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

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

तो, आपके मामले में, जो भी संदर्भ समारोह से loadpage लागू किया गया था, इसके निष्पादन संदर्भ बनाया है और और ढेर के शीर्ष पर रखा गया था। फिर, यह टेकिनपुट फ़ंक्शन, इसके निष्पादन को आमंत्रित करता है। संदर्भ बनाया गया है और अन्य फ़ंक्शंस संदर्भ को तब तक नहीं बनाया जाएगा जब तक कि टेकिनपुट संदर्भ निष्पादन स्टैक से बाहर नहीं हो जाता है। तो, सही क्रम लेनपुट, प्रोसेसिनपुट और आउटपुट इनपुट होगा।

मुझे आशा है कि यह आपके प्रश्न का उत्तर देगा।

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