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




jquery (9)

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

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


Answers

जावास्क्रिप्ट (ईसीएमएस्क्रिप्ट) विनिर्देश किसी भी थ्रेडिंग या सिंक्रनाइज़ेशन तंत्र को परिभाषित नहीं करता है।

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

एक sidenote के रूप में, एक और टिप्पणीकर्ता इस तथ्य के लिए संकेत दिया कि कोई भी जावास्क्रिप्ट विक्रेता विक्रेता थ्रेडिंग और सिंक्रनाइज़ेशन सुविधाओं को जोड़ सकता है, या एक विक्रेता इस आलेख में वर्णित अनुसार, उन सुविधाओं को स्वयं लागू करने में सक्षम कर सकता है: ajaxian.com/archives/multi-threaded-javascript ?


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


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

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

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

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

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


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

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

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


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


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


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

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


यदि आपके पास सरणी में जटिल वस्तुएं हैं तो आप फ़िल्टर का उपयोग कर सकते हैं? ऐसी परिस्थितियों में जहां $ .inArray या array.splice उपयोग करने में आसान नहीं है। विशेष रूप से अगर वस्तुओं सरणी में उथले हैं।

उदाहरण के लिए यदि आपके पास एक आईडी फ़ील्ड वाला कोई ऑब्जेक्ट है और आप ऑब्जेक्ट को सरणी से हटा देना चाहते हैं:

this.array = this.array.filter(function(element, i) {
    return element.id !== idToRemove;
});




javascript jquery