2012-01-19 43 views
5

Mã này dừng MouseMove kiện

$.ajaxSetup({async:false}); 
$.get(url).success(function(data) { result = data; }); 

Có cách nào để tránh điều này nhưng phải ghi $ .ajaxSetup ({async: false}) ;, như một chức năng tải?

Cảm ơn

bổ sung:

gì xảy ra nếu tôi cần

$.ajaxSetup({async:false}); 
$.get(url).success(function(data) { result = data; }); 
$.ajaxSetup({async:true}); 
return result 

làm thế nào để xử lý đó?

Cảm ơn

+2

Bạn không muốn '$ .ajaxSetup ({async: false})'. – Tomalak

+0

'không đồng bộ: false' tạm dừng trình duyệt, tất cả JavaScript, cho đến khi hoàn tất. –

+0

@Tomalak: Tôi cần không đồng bộ: sai, nhưng tôi không muốn tạm dừng ... –

Trả lời

6

return ngụ ý dòng mã đồng bộ. Tuy nhiên, AJAX không đồng bộ mà không có async: false. Điều này không có nghĩa là bạn nên sử dụng async: false. Thay vào đó, bạn nên thay đổi luồng mã của mình để sử dụng các cuộc gọi lại thay vì các giá trị trả lại.

Điều này là cần thiết vì không có cách nào để làm cho mã không đồng bộ đồng bộ (tức là bạn không thể sử dụng return với chức năng không đồng bộ). Cách duy nhất là cung cấp một callback chính mình cũng như:

function get(url, callback) { 
    $.get(url).success(function(data) { callback(data); }); 
} 

Giống như:

get("...", function(result) { 
    // use `result` which you normally got by assigning the return value 
    // of `get` to a variable 
}); 
5

Bạn nên tìm cách làm những gì bạn muốn mà không cần đặt async:false.

Sử dụng cuộc gọi lại từ yêu cầu ajax của bạn, bạn sẽ có thể thực hiện hầu hết mọi thứ.

+0

đã thêm vào câu hỏi của tôi, vui lòng kiểm tra –

3

async:false dừng trình duyệt, và tất cả các JavaScript, cho đến khi gọi AJAX được thực hiện. Không có cách nào xung quanh chuyện này.

Điều bạn nên làm là, thay vì cố gắng trả lại giá trị từ cuộc gọi AJAX, bạn nên thực hiện tất cả việc xử lý dữ liệu bên trong cuộc gọi lại của mình.

Bạn có thể lưu dữ liệu được trả về vào biến toàn cầu, nhưng nó sẽ không khả dụng cho đến khi hoàn thành.

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