2012-07-12 29 views
42

Kể từ jQuery 1.8, việc sử dụng async:false trong jQuery.ajax()không được dùng nữa.
Nhưng có bao nhiêu trang web bạn đã xem bằng "màn hình tải" trong khi có liên lạc AJAX đang diễn ra ở chế độ nền? Có lẽ tôi đã thấy hàng ngàn người trong số họ.Tùy chọn không đồng bộ của phương thức jQuery.ajax() không được chấp nhận, bây giờ là gì?

Trường hợp của tôi là tôi đang viết một ứng dụng dành cho thiết bị di động cần tải tệp ngôn ngữ. Và lúc đầu tôi tải tập tin ngôn ngữ và tôi lấy lại văn bản của các nút và các phần tử GUI khác từ tập tin ngôn ngữ.

Điều này thực sự tồi tệ đối với tôi. Vì nếu tệp ngôn ngữ bị thiếu, GUI sẽ không xuất hiện. Vậy làm thế nào để giải quyết nó? Đặt tất cả mã của tôi trong cuộc gọi lại success? Điều đó dường như không phải là một thực hành mã hóa tốt cho tôi. Tôi có thể giải quyết nó theo cách khác không?

+0

Bạn có thể tạo các chức năng mới. Và gọi các hàm đó trong trình xử lý onSuccess. Nó vẫn có thể xem được như vậy – Sllix

+0

Đồng bộ hóa không được chấp nhận? –

+2

@ChenKinnrot 'async = false' là 'đồng bộ;) –

Trả lời

26

Giải pháp là thêm thủ công lớp phủ để ngăn người dùng tương tác với giao diện và sau đó xóa nó sau khi truy vấn AJAX được thực hiện.

$(function() { 
    show_overlay();   

    $.ajax({ 
     // Query to server 
    }).done(function() { 
     // Verify good data 
     // Do stuff 
     remove_overlay(); 
    }); 
}); 
+0

Vâng .... tôi đang định làm điều gì đó như thế. Thx cho câu trả lời của bạn. – Juw

+1

bạn có thể giải thích cách tôi nên thêm và xóa lớp phủ đó theo cách thủ công không? show_overlay() không phải là một hàm. Xin lỗi nếu câu hỏi này là quá noob nhưng tôi mới về điều này. –

+1

@ RobertoSepúlvedaBravo Đây chỉ là một ví dụ. 'show_overlay()' là một hàm giả định hiển thị một phần tử che khuất giao diện, giống như một div lấp đầy khung nhìn có chỉ số z cao với một số nội dung. – jurgemaister

0

Tại sao bạn sử dụng ajax để tải tệp này? Chỉ cần bao gồm nó bằng cách sử dụng thẻ script.

Trong mọi trường hợp, bạn không đặt tất cả mã của mình trong onSuccess - thay vào đó bạn gọi một hàm duy nhất từ ​​đó bắt đầu chạy mã của bạn.

2

Tôi sẽ đặt cược rằng nhiều của những năm 1000 của trang không thực sự chặn giao diện người dùng trong khi chờ đợi cuộc gọi AJAX. Thay vào đó, họ có thể che khuất giao diện người dùng bằng màn hình chờ tại thời điểm cuộc gọi được thực hiện và sau đó xóa nó trên trình xử lý phản hồi.

Có nhiều cách để làm mờ giao diện người dùng (bạn thậm chí có thể sử dụng Hộp thoại giao diện người dùng jQuery được đặt thành Phương thức và không có nút thoát hoặc đóng), vì vậy tôi sẽ để lại quyết định đó cho bạn. Nhưng bố cục của mã sẽ có dạng như sau:

var someFunction = function() { 

    // any pre-conditions to the logic 
    // obscure the UI here 

    $.ajax({ 
     url: 'ajax/test.html', 
     success: function(data) { 

      // handle the response 
      // show the UI again 

     }, 
     error: function(data) { 

      // handle the response 
      // show the UI again 

     } 
    }); 
} 

Tôi chắc chắn có nhiều cách để đạt được thứ tự các sự kiện đó, nhưng đó là ý tưởng chung. Chặn giao diện người dùng không bao giờ thực sự là ý định và tôi cho rằng đó là một quyết định thậm chí còn khó khăn hơn đối với jQuery đối với bao gồm tính năng đó là xóa. Nó có nghĩa là không đồng bộ.

+0

Nhưng nếu bạn thực sự muốn chặn UI sử dụng plugin blockUI: http://jquery.malsup.com/block/ – Simon

+0

@Simon: Chắc chắn, nếu bạn _really_ muốn. Nhưng nó không được khuyến khích và, thường xuyên hơn không, là một dấu hiệu cho thấy người ta cần phải nghĩ lại cách tiếp cận của một người. Có thể có ngoại lệ, mặc dù tôi không thể nghĩ ra bất kỳ điều gì ngay bây giờ. – David

+0

Thx David cho câu trả lời của bạn! – Juw

27

tôi đọc official discussion trong vé về việc không dùng các tham số này và đây là những gì tôi đã hiểu:

  • Vấn đề là thực hiện Promise s (1) cho đồng bộ AJAX mang lại cho họ trên cao.

  • Có rất nhiều trường hợp sử dụng AJAX đồng bộ hóa thực tế, ví dụ: giữ trạng thái trước khi tải trang. Do đó, chức năng này sẽ ở lại, nhưng cách bạn sử dụng nó có thể thay đổi.

  • Giải pháp gần nhất (hạ cánh 1.8?) Chỉ hỗ trợ gọi lại (nhưng không phải lời hứa) khi asyncfalse.

Để kết luận: Giữ sử dụng async: false nếu bạn phải làm, nhưng hãy cẩn thận của nhược điểm của nó (chặn của VM). Đừng lo lắng, bạn sẽ được cung cấp giải pháp thay thế nếu tính năng này bị xóa khỏi biểu mẫu $.ajax().

+0

"Bảo quản trạng thái trước khi tải trang" nghĩa là gì? Tôi không thể nghĩ ra một sử dụng tốt duy nhất cho AJAX đồng bộ. – user2867288

+3

@ user2867288, tải trang là sự kiện xảy ra khi người dùng cố gắng đóng tab/cửa sổ trình duyệt. "Trạng thái bảo quản" có thể có nghĩa là nhiều thứ: tự động lưu trữ dữ liệu biểu mẫu, cho máy chủ biết rằng tương tác của người dùng đã hoàn thành, gửi một số dữ liệu phân tích (ví dụ: lượng thời gian người dùng đã sử dụng trên trang). Có thực sự là một trường hợp sử dụng cho điều này - đó là lý do tại sao [Beacon API] (https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon) đã được tạo ra. Khi nó có hỗ trợ crossbrowser thích hợp, không có nhiều nhu cầu cho AJAX đồng bộ. – Infeligo

Các vấn đề liên quan