2011-09-10 15 views
111

सत्यापित करने के लिए इस परिदृश्य पर विचार करें:jQuery "प्रत्येक()" फ़ंक्शन तुल्यकालिक है?

function validateForm (validCallback) { 
    $('#first-name').add($('#last-name')).add($('#address')).each(function() { 
     // validating fields and adding 'invalid' class to invalid fields. 
    }); 
    // doing validation this way for almost 50 fields (loop over 50 fields) 
    if ($('#holder .invalid').length == 0) { 
     // submitting data here, only when all fields are validated. 
    } 
} 

अब, मेरी समस्या यह है कि, अगर ब्लॉक से पहले छोरों पूरा कर लें निष्पादित हो रहा है। मुझे validateForm के शरीर को सिंक्रनाइज़ निष्पादित करने की उम्मीद थी, लेकिन ऐसा लगता है कि jQuery each() फ़ंक्शन को असीमित रूप से निष्पादित किया जाता है। क्या मैं सही हू? यह क्यों काम नहीं करता है?

+2

सत्यापन कोड कैसा दिखता है? 'प्रत्येक' तुल्यकालिक है, लेकिन अंदर का कोड नहीं हो सकता है ... – lonesomeday

+1

' प्रत्येक 'को सिंक्रनाइज़ तरीके से संसाधित किया जाता है। क्या आप लूप के अंदर से अपने स्वयं के एसिंक ऑपरेशन शुरू कर रहे हैं? – Jon

+3

इसी तरह की समस्या .. आपने इसे कैसे हल किया? – sakthig

उत्तर

134

हां, jQuery each विधि तुल्यकालिक है। लगभग सभी जावास्क्रिप्ट तुल्यकालिक है। केवल अपवाद हैं AJAX, टाइमर (setTimeout और setInterval), और HTML5 वेब वर्कर्स।
आपकी समस्या शायद आपके कोड में कहीं और है।

-8

jQuery.each विधि सिंक्रनाइज़ रूप से loops, लेकिन आप गारंटी नहीं दे सकते कि यह किसी भी विशिष्ट क्रम में आइटम के माध्यम से लूप होगा।

+18

नहीं, यह दस्तावेज़ में दिखाई देने वाले क्रम में हमेशा उनके माध्यम से लूप करेगा। – Abraham

+2

यह इस बात पर निर्भर करता है कि आप क्या कर रहे हैं। प्रत्येक सरणी पर इंडेक्स ऑर्डर निष्पादन की गारंटी देता है लेकिन किसी ऑब्जेक्ट के लिए कोई गारंटी नहीं देता है (जो स्पष्ट होना चाहिए)। – Deadron

6

jQuery पूरी तरह से जावास्क्रिप्ट लाइब्रेरी है। ajax, setTimeout और setInterval को छोड़कर JavaScript में अतुल्यकालिक रूप से निष्पादित किया जा सकता है। तो each निश्चित रूप से समकालिक रूप से निष्पादित किया गया है। each ब्लॉक कोड के अंदर निश्चित रूप से कुछ जेएस त्रुटि है। आपको किसी भी त्रुटि के लिए कंसोल में एक नज़र रखना चाहिए।

वैकल्पिक रूप से आप कतार में किसी भी फ़ंक्शन को निष्पादित करने के लिए jQuery queue पर एक नज़र डाल सकते हैं। यह सुनिश्चित करेगा कि कतारबद्ध फ़ंक्शन केवल तभी निष्पादित किया जाएगा जब पिछले कोड निष्पादन पूर्ण हो जाए।

+7

वादे भी हैं ... बस कह रहे हैं :) – iwayneo

4

उस प्रश्न को पूछने का एक अन्य कारण यह होगा कि। (.each()) फ़ंक्शन झूठा लौटाता है, और "अतिरिक्त झूठी" जानकारी को पारित करने के लिए एक अतिरिक्त चर का उपयोग किया जाना चाहिए।

var all_ok=true; 
$(selector).each(function(){ 
    if(!validate($(this))){ 
     all_ok=false; //this tells the outside world something went wrong 
     return false; //this breaks the .each iterations, returning early 
    } 
}); 
if(!all_ok){ 
    alert('something went wrong'); 
} 
0

वही समस्या। तो मैं इस

var y = jQuery(this).find(".extra_fields"); 
for(var j in y) 
{ 
    if(typeof y[j] =='object') 
    { 
     var check = parseInt(jQuery(y[j]).val()); 
     if(check==0){ 
      jQuery(y[j]).addClass('js_warning'); 
      mes="Bạn vui lòng chọn đầy đủ các thuộc tính cho sản phẩm"; 
      done=false; 
      eDialog.alert(mes); 
      return false; 
     } 
    } 

} 
1

Thats तरह ठीक मैं कैसे कर यह

function getAllEventsIndexFromId(id){ 
    var a; 
    $.each(allEvents,function(i,val){ 
        if (val.id == id){a=i; } 
       }); 
    return a; 
    } 
1

मेरे लिए यह asyncronous तरह काम करता है। यदि यह सिंक काम करता है, तो यह इस तरह क्यों काम करता है:

var newArray = []; 
$.each(oldArray, function (index, value){ 
     if($.inArray(value["field"], field) === -1){ 
      newArray.push(value["field"]); 
     } 
    } 
); 

//do something with newArray here doesn't work, newArray is not full yet 

$.when.apply($, newArray).then(function() { 
    //do something with newArray works!! here is full 
}); 
संबंधित मुद्दे