2009-11-02 8 views
50

यहां मेरा मुद्दा है - मुझे jQuery.getScript() का उपयोग करके गतिशील रूप से कई स्क्रिप्ट डाउनलोड करने की आवश्यकता है और सभी स्क्रिप्ट लोड होने के बाद कुछ JavaScript कोड निष्पादित करने की आवश्यकता है, इसलिए मेरी योजना कुछ ऐसा करने के लिए थी:जावास्क्रिप्ट बहुप्रचारित है?

function GetScripts(scripts, callback) 
{ 
    var len = scripts.length 
    for (var i in scripts) 
    { 
    jQuery.getScript(scripts[i], function() 
    { 
     len --; 
     // executing callback function if this is the last script that loaded 
     if (len == 0) 
     callback() 
    }) 
    } 
} 

यह इच्छा अगर हम उस स्क्रिप्ट को मानते हैं तो केवल भरोसेमंद काम करें। प्रत्येक स्क्रिप्ट आग के लिए ईवेंट डाउनलोड करें और अनुक्रमिक रूप से और सिंक्रनाइज़ निष्पादित करें, इसलिए ऐसी स्थिति कभी नहीं होगी जब दो या अधिक ईवेंट हैंडलर (len == 0) के लिए चेक पास करेंगे और कॉलबैक विधि निष्पादित करेंगे ।

तो मेरा प्रश्न - क्या यह धारणा सही है और यदि नहीं, तो मैं क्या करने की कोशिश कर रहा हूं, हासिल करने का तरीका क्या है?

+1

जावास्क्रिप्ट बहुप्रचारित है, उदाहरण दिखाने के लिए एक लिंक है: http://ajaxian.com/archives/multi-threaded-javascript –

+6

@aforloney - यह बिल्कुल सही नहीं है। जैसा कि लेख में उद्धृत सूर्य अभियंता कहते हैं, ** राइनो जावास्क्रिप्ट इंजन ** "जावा विधि कॉल की अनुमति देता है। इसलिए, हम इसका उपयोग जावा प्लेटफ़ॉर्म कक्षाओं के लिए स्क्रिप्ट रैपर बनाने के लिए कर सकते हैं ... हम आसानी से स्क्रिप्ट में धागे बना सकते हैं।" –

+0

[async.js] (https://github.com/caolan/async) सभी स्क्रिप्ट के बाद कोड निष्पादित करने के लिए बहुत अच्छा है, या तो समानांतर या अनुक्रम में चलाया जाता है, –

उत्तर

71

नहीं, जावास्क्रिप्ट बहु-थ्रेडेड नहीं है। यह घटना संचालित है और घटनाओं की आपकी धारणा अनुक्रमिक रूप से फायरिंग (मान लीजिए कि वे अनुक्रमिक रूप से लोड हो रही हैं) वह है जो आप देखेंगे। आपका वर्तमान कार्यान्वयन सही दिखाई देता है। मेरा मानना ​​है कि jQuery का .getScript() एक नया <script> टैग इंजेक्ट करता है, जो उन्हें सही क्रम में लोड करने के लिए भी मजबूर होना चाहिए।

+0

पूरा हो जाता है मैं मूल रूप से परवाह नहीं करता कि लोडिंग के आदेश के बारे में , मुझे बस यह सुनिश्चित करने की ज़रूरत है कि मेरी कॉलबैक फ़ंक्शन केवल तभी निष्पादित की जाएगी जब सभी स्क्रिप्ट लोड हों, क्योंकि यह उन सभी पर निर्भर करती है। – Andrey

+8

यह शायद एक शर्मनाक सरल दिमागी सवाल है, लेकिन यदि जावास्क्रिप्ट बहु-थ्रेडेड नहीं है, तो क्यों कई जंजीर jQuery एनिमेशन (उदाहरण के लिए) अनुक्रम में बजाय एक साथ होने लगते हैं? –

+10

एनीमेशन अपडेट टाइमर ईवेंट को निकालकर ट्रिगर किया जाता है। – Jacob

10

नहीं, सभी ब्राउज़र आपको जावास्क्रिप्ट के लिए केवल एक थ्रेड देते हैं।

+3

+1, हालांकि वे अन्यथा कर सकते थे, लेकिन उस विनाश के लिए जो घटित होगा। –

33

वर्तमान में जावास्क्रिप्ट बहुप्रचारित नहीं है, लेकिन निकट भविष्य में चीजें बदलेगी। new thing in HTML5Worker कहा जाता है। यह आपको पृष्ठभूमि में कुछ काम करने की अनुमति देता है।

लेकिन वर्तमान में यह सभी ब्राउज़रों द्वारा समर्थित नहीं है।

+0

वर्कर्स जावास्क्रिप्ट कार्यान्वयन में एक नई बात है, लेकिन मुझे नहीं लगता कि एचटीएमएल 5 – Andrey

+0

ओह के साथ इसका कोई संबंध नहीं है ... हाँ, मेरा बुरा ... मुझे नहीं पता कि मुझे इसे –

+5

से कहां मिल रहा है वेब वर्कर्स एचटीएमएल 5 विनिर्देश का हिस्सा। http://www.whatwg.org/specs/web-workers/current-work/ – Rob

10

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

15

JavaScript (ECMAScript) specification किसी भी थ्रेडिंग या सिंक्रनाइज़ेशन तंत्र को परिभाषित नहीं करता है।

इसके अलावा, हमारे ब्राउज़र में जावास्क्रिप्ट इंजन जानबूझकर एकल-थ्रेडेड हैं, क्योंकि एक से अधिक यूआई थ्रेड एक साथ काम करने की इजाजत देते हैं, जो कीड़े का एक बड़ा हिस्सा खुल जाएगा। तो आपकी धारणा और कार्यान्वयन सही हैं। Multi-threaded JavaScript:

एक sidenote के रूप, another commenter तथ्य यह है कि किसी भी JavaScriptengine विक्रेता सूत्रण और तुल्यकालन सुविधाओं को जोड़ने सकता है, या एक विक्रेता उपयोगकर्ताओं इस आलेख में वर्णित के रूप में उन सुविधाओं, खुद को लागू करने के लिए सक्षम हो सकता है का संकेत?

+1

मैं हमेशा एक जवाब से प्रभावित हूं जो spec पर जाता है। ps। (ईमानदारी से, कटाक्ष नहीं) –

1

विचार यह है कि यह एक "मजबूर", देरी स्क्रिप्ट वितरण के साथ बाहर की कोशिश के लिए दिलचस्प हो सकती है ...

  1. गूगल
  2. 2 के रूप में delayjs.php जोड़ा से दो उपलब्ध लिपियों जोड़ा सरणी तत्व। delayjs.php को खाली जेएस ऑब्जेक्ट देने से पहले 5 सेकंड के लिए सोता है।
  3. एक कॉलबैक कि "सत्यापित करता" स्क्रिप्ट से उम्मीद वस्तुओं के अस्तित्व फ़ाइलों गयी।
  4. ने कुछ जेएस कमांड जोड़े जो गेट्रॉक() कॉल के बाद लाइन पर निष्पादित किए गए हैं, "परीक्षण" अनुक्रमिक जेएस कमांड के लिए।

स्क्रिप्ट लोड के साथ परिणाम अपेक्षित है; अंतिम स्क्रिप्ट लोड होने के बाद ही कॉलबैक ट्रिगर किया जाता है। मुझे आश्चर्य हुआ कि जेएस कमांड जो गेट्रैंक() कॉल के बाद अंतिम स्क्रिप्ट लोड करने की प्रतीक्षा किए बिना ट्रिगर किए गए थे। मैं धारणा है कि कोई js आदेशों जबकि ब्राउज़र लोड करने के लिए एक js स्क्रिप्ट पर इंतज़ार कर रहा था क्रियान्वित किया जाएगा तहत किया गया था ...

var scripts = []; 
scripts.push('http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js'); 
scripts.push('http://localhost/delayjs.php'); 
scripts.push('http://ajax.googleapis.com/ajax/libs/scriptaculous/1.8.3/scriptaculous.js'); 


function logem() { 
    console.log(typeof Prototype); 
    console.log(typeof Scriptaculous); 
    console.log(typeof delayedjs); 
} 

GetScripts(scripts, logem); 

console.log('Try to do something before GetScripts finishes.\n'); 
$('#testdiv').text('test content'); 

<?php 

sleep(5); 
echo 'var delayedjs = {};'; 
+2

ठीक है, अपने आप को भ्रमित न करें - ब्राउज़र जावास्क्रिप्ट थ्रेड के बाहर स्क्रिप्ट को डाउनलोड करता है, इसलिए जावास्क्रिप्ट को लोड करने के लिए स्क्रिप्ट के इंतजार किए बिना – Andrey

0

आप शायद multithreadedness किसी तरह यदि आप एक में फ्रेम के एक नंबर बनाने के प्राप्त कर सकते हैं एचटीएमएल दस्तावेज़, और उनमें से प्रत्येक में एक स्क्रिप्ट चलाएं, प्रत्येक मुख्य फ्रेम में एक फ़ंक्शन को कॉल करता है जिसे उन कार्यों के परिणामों को समझना चाहिए।

2

स्पष्ट होने के लिए, ब्राउज़र जेएस कार्यान्वयनmultithreaded नहीं है।

भाषा, जेएस,बहु-थ्रेडेड हो सकता है।

हालांकि प्रश्न यहां लागू नहीं होता है।

क्या लागू होता है यह है कि getScript() असीमित है (तुरंत लौटाता है और कतारबद्ध हो जाता है), हालांकि, ब्राउजर अनुक्रमिक रूप से <script> सामग्री को डीओएम संलग्न करेगा ताकि आपका आश्रित जेएस कोड क्रमशः लोड हो सके। यह एक ब्राउज़र सुविधा है और जेएस थ्रेडिंग या getScript() कॉल पर निर्भर नहीं है।

अगर getScript() ने xmlHTTPRequest, setTimeout(), websockets या किसी अन्य async कॉल के साथ स्क्रिप्ट पुनर्प्राप्त की है तो आपकी स्क्रिप्ट को क्रम में निष्पादित करने की गारंटी नहीं दी जाएगी। हालांकि, आपके कॉलबैक को तब भी कॉल किया जाएगा जब सभी स्क्रिप्ट निष्पादित हो जाएंगे क्योंकि आपके 'लेन' चर के निष्पादन संदर्भ को बंद कर दिया गया है जो आपके कार्य के असीमित आविष्कार के माध्यम से इसका संदर्भ बना रहता है।

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