Hàm jQuery có mỗi hàm () có đồng bộ không?


131

xem xét kịch bản này để xác nhận:

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.
   }
}

Bây giờ, vấn đề của tôi là, những nếu khối được thực hiện trước khi vòng đã kết thúc. Tôi dự kiến ​​phần thân của validateFormsẽ được thực thi đồng bộ, nhưng có vẻ như each()hàm jQuery được thực thi không đồng bộ. Tôi có đúng không Tại sao điều này không làm việc?


2
Mã xác nhận trông như thế nào? eachlà đồng bộ, nhưng mã bên trong có thể không ...
lonesomeday

1
eachchính nó được xử lý đồng bộ. Bạn đang bắt đầu một số hoạt động không đồng bộ của riêng bạn từ bên trong vòng lặp?
Jon

3
vấn đề tương tự ở đây .. làm thế nào bạn giải quyết nó?
sakthig

Lâu lắm rồi, tôi không thể nhớ được. Nhưng tôi biết rằng các câu trả lời đã giúp tôi. Vì vậy, tôi có thể đã sử dụng các khối mã async trong mã xác thực của mình (như cố gắng xác thực địa chỉ bằng yêu cầu ajax).
Saeed Neamati

1
hmm .. tôi đã giải quyết nó theo cách này .. tôi đã thực hiện "return false" bên trong mỗi chức năng không hoạt động tôi đoán .. hiện đang duy trì một cờ bên trong mỗi chức năng này và trả lại cờ đó khi kết thúc xác thực ..
sakthig

Câu trả lời:


157

Có, eachphương thức jQuery là đồng bộ. Gần như TẤT CẢ JavaScript là đồng bộ. Các ngoại lệ duy nhất là AJAX, bộ tính giờ ( setTimeoutsetInterval) và Công nhân web HTML5.
Vấn đề của bạn có lẽ là một nơi khác trong mã của bạn.


7

jQueryhoàn toàn là một thư viện javascript. Ngoại trừ ajax, setTimeoutsetIntervalkhông có gì có thể thực hiện không đồng bộ trong JavaScript. Vì vậy, eachchắc chắn được thực hiện đồng bộ. Chắc chắn có một số lỗi js bên trong eachmã khối. Bạn nên xem trong bảng điều khiển cho bất kỳ lỗi nào.

Ngoài ra, bạn có thể xem hàng đợi jQuery để thực hiện bất kỳ chức năng nào trong hàng đợi. Điều này sẽ đảm bảo chức năng xếp hàng sẽ chỉ được thực hiện khi quá trình thực thi mã trước đó hoàn tất.


7
cũng có những lời hứa ... chỉ cần nói :)

6

Một lý do khác để đặt câu hỏi đó là .each sẽ đơn giản dừng lặp khi hàm (.each ()) trả về false và một biến bổ sung phải được sử dụng để truyền thông tin "return false".

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

Đối với tôi nó hoạt động như không đồng bộ. Nếu nó hoạt động đồng bộ, tại sao nó hoạt động như vậy:

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 falsetrong .each()hàm chỉ phá vỡ vòng lặp và mã còn lại bên ngoài vòng lặp vẫn thực thi. Vì vậy, đặt một cờ trong .each()vòng lặp và kiểm tra nó bên ngoài vòng lặp.


1

Vấn đề tương tự. Vì vậy, tôi sửa chữa như thế này

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

Đó là cách tôi làm điều đó

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

0

Tôi gặp vấn đề tương tự. $ .each của tôi nằm trong chức năng thành công của lệnh gọi ajax. tôi đã thực hiện cuộc gọi ajax đồng bộ bằng cách thêm async: falsevà nó hoạt động.


-9

Phương thức jQuery.each lặp lại đồng bộ, nhưng bạn không thể đảm bảo rằng nó sẽ lặp qua các mục theo bất kỳ thứ tự cụ thể nào.


21
Không, nó sẽ luôn lặp qua chúng theo thứ tự chúng xuất hiện trong tài liệu.
Áp-ra-ham

3
Nó phụ thuộc vào những gì bạn đang lặp đi lặp lại. Mỗi đảm bảo thực hiện thứ tự chỉ mục trên một mảng nhưng không đảm bảo cho một đối tượng (điều này là hiển nhiên).
Deadron
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.