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সিঙ্ক্রোনাস, তবে ভিতরে কোডটি নাও হতে পারে ...
একাকী দিন

1
eachনিজেই সমকালীনভাবে প্রক্রিয়াজাত হয়। আপনি লুপের ভিতরে থেকে নিজের কিছু অ্যাসিঙ্ক অপারেশন শুরু করছেন?
জন

3
অনুরূপ সমস্যা এখানে .. আপনি এটি সমাধান কিভাবে?
sakthig

এটা অনেক দিন আগের, আমি মনে করতে পারি না। তবে আমি জানি যে উত্তরগুলি আমাকে সাহায্য করেছিল। সুতরাং, আমি আমার বৈধতা কোডে async কোড ব্লক ব্যবহার করতে পারি (যেমন একটি এজ্যাক্স অনুরোধ ব্যবহার করে ঠিকানা বৈধ করার চেষ্টা করা)।
সা Saeedদ নেমতি

1
হুম .. আমি এটি এইভাবে সমাধান করেছি .. আমি অনুমান করি না যে প্রতিটি ফাংশনের ভিতরে "মিথ্যা ফিরতি" করছিলাম .. এখন এই প্রতিটি ফাংশনের অভ্যন্তরে একটি পতাকা বজায়
রেখেছি

উত্তর:


158

হ্যাঁ, jQuery eachপদ্ধতিটি সিঙ্ক্রোনাস। প্রায় সমস্ত জাভাস্ক্রিপ্ট সিঙ্ক্রোনাস। একমাত্র ব্যতিক্রম হলেন এজেএক্স, টাইমার ( setTimeoutএবং setInterval) এবং এইচটিএমএল 5 ওয়েব ওয়ার্কার্স।
আপনার সমস্যাটি সম্ভবত আপনার কোডের অন্য কোথাও।


7

jQueryনিখুঁতভাবে একটি জাভাস্ক্রিপ্ট লাইব্রেরি। ব্যতীত ajax, setTimeoutএবং setIntervalএমন কিছু নেই যা দ্বারা অ্যাসিঙ্ক্রোনাস মধ্যে মৃত্যুদন্ড কার্যকর করতে পারছে না JavaScript। সুতরাং eachঅবশ্যই সুসংগতভাবে কার্যকর করা হয়। eachব্লক কোডের ভিতরে অবশ্যই কিছু জেএস ত্রুটি রয়েছে । কোনও ত্রুটির জন্য আপনার কনসোলে একবার দেখে নেওয়া উচিত।

বিকল্পভাবে আপনি কিউর যে কোনও ক্রিয়াকলাপ সম্পাদন করতে jQuery সারিটি একবার দেখে নিতে পারেন । এটি নিশ্চিত করবে যে সারিযুক্ত ক্রিয়াকলাপ কেবলমাত্র পূর্ববর্তী কোড এক্সিকিউশন সম্পূর্ণ হলেই কার্যকর করা হবে।


7
এখানে প্রতিশ্রুতিও রয়েছে ... ঠিক বলেছেন :)

6

এই প্রশ্নটি জিজ্ঞাসার আরেকটি কারণ হ'ল। .Ech কেবল পুনরাবৃত্তি থামিয়ে দেবে যখন (.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()ফাংশন শুধুমাত্র লুপ এবং লুপ এখনও, executes বাহিরে অবশিষ্ট কোড বিরতি। সুতরাং লুপটিতে একটি পতাকা সেট করুন .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

আমি কীভাবে তা করি ts

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

0

আমারো একই ইস্যু ছিল. আমার ea .এইচটি আজাক্স কলটির সাফল্য ফাংশনের ভিতরে ছিল। আমি আমার এজাক্স কলকে সংযুক্ত করে যুক্ত async: falseকরেছিলাম এবং এটি কার্যকর হয়েছে।


-9

JQuery.each পদ্ধতিটি সুসংগতভাবে লুপ করে তবে আপনি কোনও গ্যারান্টি দিতে পারবেন না যে এটি কোনও নির্দিষ্ট ক্রমে আইটেমগুলি দিয়ে লুপ করবে।


21
না, ডকুমেন্টে তারা প্রদর্শিত ক্রমে এটি সর্বদা লুপ করবে।
ইব্রাহিম

3
এটি নির্ভর করে আপনি কী পুনরাবৃত্তি করছেন। প্রতিটি অ্যারেতে সূচক আদেশের প্রয়োগের গ্যারান্টি দেয় তবে কোনও সামগ্রীর জন্য কোনও গ্যারান্টি দেয় না (যা স্পষ্ট হওয়া উচিত)।
ডেড্রন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.