JQuery "प्रत्येक ()" फ़ंक्शन तुल्यकालिक है?


131

मान्य करने के लिए इस परिदृश्य पर विचार करें:

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
सत्यापन कोड कैसा दिखता है? eachतुल्यकालिक है, लेकिन अंदर कोड नहीं हो सकता है ...
lonsomeday

1
eachखुद को सिंक्रोनाइज़ किया जाता है। क्या आप लूप के अंदर से अपना खुद का कुछ एसिंक्स ऑपरेशन शुरू कर रहे हैं?
जॉन

3
इसी तरह की समस्या यहाँ .. आप इसे कैसे हल किया?
सक्थिग

बहुत समय पहले की बात है, मुझे याद नहीं आ रहा है। लेकिन मुझे पता है कि जवाब से मुझे मदद मिली। इसलिए, मैंने अपने सत्यापन कोड में async कोड ब्लॉक का उपयोग किया हो सकता है (जैसे ajax अनुरोध का उपयोग करके पते को मान्य करने का प्रयास करना)।
सईद नेमाटी

1
हम्म .. मैं इसे इस तरह से हल करता हूं .. मैं प्रत्येक फ़ंक्शन के अंदर "वापस झूठे" कर रहा था जो मुझे लगता है कि काम नहीं कर रहा था .. अब प्रत्येक फ़ंक्शन के अंदर एक झंडा बनाए रख रहा हूं और सत्यापन के अंत में उस ध्वज को वापस कर रहा
हूं

जवाबों:


158

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


7

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

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


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

6

उस प्रश्न को पूछने का एक और कारण यह होगा कि .each () ()) फ़ंक्शन के गलत होने पर .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');
}

2

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

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
});

2

return false.each()फ़ंक्शन में केवल लूप को तोड़ता है, और लूप के बाहर शेष कोड अभी भी निष्पादित होता है। इसलिए .each()लूप में एक ध्वज सेट करें और इसे लूप के बाहर जांचें।


1

एक ही समस्या है। तो मैं इस तरह तय करता हूं

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

मैं यह कैसे करता है

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

0

मेरी भी यही समस्या थी। मेरे $ .each अजाक्स कॉल के सफलता समारोह के अंदर था। मैंने जोड़कर अपने अजाक्स कॉल को सिंक्रोनाइज़ किया async: falseऔर यह काम कर गया।


-9

JQuery.each विधि समान रूप से लूप करती है, लेकिन आप यह गारंटी नहीं दे सकते कि यह किसी विशिष्ट क्रम में आइटम के माध्यम से लूप करेगा।


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

3
यह इस बात पर निर्भर करता है कि आप क्या कर रहे हैं। प्रत्येक एक सरणी पर सूचकांक आदेश निष्पादन की गारंटी देता है लेकिन किसी वस्तु के लिए कोई गारंटी नहीं देता है (जो स्पष्ट होना चाहिए)।
डेड्रॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.