javascript - जावास्क्रिप्ट बहुप्रचारित है?




jquery (6)

यहां मेरी समस्या है - मुझे 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) के लिए चेक पास करेंगे और निष्पादित करेंगे कॉलबैक विधि।

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


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


जेएस सामान्य रूप से एकल धागा है। हालांकि एचटीएमएल 5 वेब श्रमिक बहु-थ्रेडिंग पेश करते हैं। http://www.html5rocks.com/en/tutorials/workers/basics/ पर और पढ़ें


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


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


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

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

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

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 = {};';

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

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

सवाल हालांकि यहां लागू नहीं होता है।

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

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






jquery