2011-09-22 31 views
5

Tôi đã viết một hàm JavaScript gọi không đồng bộ một dịch vụ web bằng XmlHttpRequest. Tôi đã được yêu cầu làm cho chức năng này hoàn thành công việc của nó trước khi trang được hiển thị.Có thể hủy bỏ XmlHttpRequest đồng bộ không?

Tôi nghĩ tôi có thể yêu cầu AJAX đồng bộ nhưng tôi không muốn điều này khiến trang treo quá lâu - Tôi muốn hủy yêu cầu sau 1 giây nếu không nhận được phản hồi.

Có thể hủy bỏ XmlHttpRequest đồng bộ không?

+0

Câu hỏi nghe có vẻ như "Tôi có thể đặt kịch bản thời gian chờ khách hàng cho đồng bộ XMLHttpRequest"? –

Trả lời

4

Bạn không thể:

http://www.hunlock.com/blogs/Snippets:_Synchronous_AJAX sais: "AJAX Synchronous (Really SJAX - Synchronous Javascript và XML) là phương thức có nghĩa là javascript sẽ ngừng xử lý chương trình của bạn cho đến khi kết quả đã bị thu được từ máy chủ Trình duyệt xử lý các cuộc gọi như một hộp cảnh báo hoặc một hộp nhắc chỉ nó không chờ đợi cho đầu vào từ người dùng, nhưng trên đầu vào của máy chủ từ xa "

Khi trình duyệt chạy yêu cầu đồng bộ hóa, nó sẽ đợi cho đến khi nó nhận được phản hồi.

2

Trước hết, các cuộc gọi AJAX đồng bộ là điều xấu vì chúng đang chặn toàn bộ công cụ trình duyệt JavaScript (mà bạn biết).

Chỉ đơn giản là thực hiện cuộc gọi một cách không đồng bộ và loại bỏ kết quả nếu nó đến muộn hơn sau một giây không đủ? Nếu bạn thực sự muốn chờ đợi kết quả mà bạn vẫn có thể sử dụng setTimeout() (jQuery cho thuận tiện, không bắt buộc):

var result; 
var xhr = $.ajax('/url', function(response) { 
    result = response; 
}); 
setTimeout(function() { 
    if(result) { 
    //AJAX call done within a second, proceed with rendering 
    } else { 
    //One second passed, no result yet, discard it and move on 
    xhr.abort(); 
    } 
}, 1000); 

Với phương pháp này bạn không chặn trình duyệt trong khi bạn vẫn không cần phải chờ đợi Cuộc gọi AJAX.

+0

"Các cuộc gọi AJAX đồng bộ là điều ác" - phụ thuộc, bởi vì đôi khi việc chặn toàn bộ trình duyệt javascript là cần thiết :) –

1

XMLHttpRequest hỗ trợ abort phương pháp, bạn có thể biết thêm chi tiết về nó ở đây: http://www.w3.org/TR/XMLHttpRequest/#the-abort-method

Nhưng bạn cần phải kiểm tra bao nhiêu browserы hỗ trợ nó. Ví dụ: abort được giới thiệu trong Windows Internet Explorer 7 trở lên.

Trước hoặc sau khi gọi send() phương thức XMLHttpRequest đối tượng, bạn có thể thiết lập bộ đếm thời gian trễ n giây sẽ làm gián đoạn hoạt động không đồng bộ đang diễn ra.

0

Có thể trong IE.Sử dụng thuộc tính thời gian chờ.

mã dưới đây làm việc cho tôi

xmlhttp.open("method","url",false); 
xmlhttp.timeout="time in ms"; 
xmlhttp.ontimeout=function(){}; 
xmlhttp.send(); 
Các vấn đề liên quan