Tôi có một cuộc gọi Ajax hiện cần phải đồng bộ. Tuy nhiên, trong khi cuộc gọi Ajax này đang thực thi, giao diện trình duyệt bị đóng băng, cho đến khi cuộc gọi trả về. Trong trường hợp hết thời gian chờ, điều này có thể đóng băng trình duyệt cho một số significant period of time.Có thể tải cửa sổ trình duyệt khi đang trong vòng lặp Javascript không?
Có cách nào để trình duyệt (bất kỳ trình duyệt nào) làm mới giao diện người dùng, nhưng không thực thi bất kỳ Javascript nào không? Lý tưởng nhất nó sẽ là một số lệnh như window.update()
, mà sẽ cho phép làm mới giao diện người dùng thread.
Nếu đây sẽ có thể, sau đó tôi có thể thay lời gọi AJAX đồng bộ với một cái gì đó như:
obj = do_async_ajax_call();
while (!obj.hasReturned()) {
window.update();
}
// synchronous call can resume
Lý do mà tôi không thể sử dụng setTimeout
, hoặc tiếp tục một hàm trong khi gọi lại, đó là dòng chảy thực hiện không thể bị gián đoạn: (có quá nhiều biến trạng thái mà tất cả phụ thuộc vào nhau, và dòng chảy long_function()
nếu không sẽ phải được nối lại bằng cách nào đó):
function long_function() {
// lots of code, reads/writes variable 'a', 'b', ...
if (sync_call_is_true()) {
// lots of code, reads/writes variable 'a', 'b', ...
} else {
// lots of code, reads/writes variable 'a', 'b', ...
}
// lots of code, reads/writes variable 'a', 'b', ...
return calculated_value;
}
Tại sao cuộc gọi cần phải đồng bộ? –
Bạn có thể đăng toàn bộ mã cuộc gọi không? Điều này có thể có thể được đơn giản hóa và sử dụng các chức năng XHR để hỗ trợ những gì bạn cần (trừ khi jQuery là một tùy chọn, sau đó thậm chí còn sạch hơn). Nếu không phải là một tùy chọn, tôi yêu cầu bạn đổi tên hàm thành 'do_sync_jax_call(); ' –