jQuery: Thực hiện các yêu cầu AJAX đồng bộ


187

Tôi đã thực hiện một số jQuery trong quá khứ, nhưng tôi hoàn toàn bế tắc về điều này. Tôi biết về những ưu và nhược điểm của việc sử dụng các cuộc gọi ajax đồng bộ, nhưng ở đây sẽ được yêu cầu.

Trang từ xa được tải (được điều khiển bằng fireorms), nhưng không hiển thị trở lại.

Tôi nên làm gì khác nhau để làm cho chức năng của tôi trở lại đúng cách?

function getRemote() {

    var remote;

    $.ajax({
        type: "GET",
        url: remote_url,
        async: false,
        success : function(data) {
            remote = data;
        }
    });

    return remote;

}

Mã của bạn có vẻ tốt. nó đang trở về cái gì Có lỗi js nào không?
ShankarSangoli

11
Tôi thấy nó khá mỉa mai - Bạn đang hỏi cách thực hiện hoạt động "JavaScript không đồng bộ & XML" một cách đồng bộ. Những gì bạn thực sự cần thực hiện là một "SJAX".
VitalyB

3
Lưu ý: thông số kỹ thuật đã bắt đầu phản đối các yêu cầu AJAX đồng bộ.
Léo Lam

2
dường như tuyên bố "[đồng bộ] sẽ được yêu cầu" cho thấy sự thiếu hiểu biết về các công cụ JavaScript, do đó, một ứng dụng được kiến ​​trúc kém. Tôi muốn hiểu nếu có những trường hợp thực sự cần phải đồng bộ hóa.
pmont

15
@pmont seems that the statement "[synchronous] will be required" indicates a lack of understanding of JavaScript engines, thus a poorly architected app.Hoặc một sự hiểu biết rất tốt: Nếu bạn muốn thực hiện một cuộc gọi AJAX onbeforeunload, sử dụng một yêu cầu đồng bộ thực sự là cách được đề xuất (vì cửa sổ trình duyệt sẽ biến mất trước khi yêu cầu trả lại nếu không). Bằng bất cứ cách nào anh ta nói rõ ràng 'Tôi biết về những ưu và nhược điểm của việc sử dụng các cuộc gọi ajax đồng bộ' ... Có lẽ chỉ cần tin anh ta?
Stijn de Witt

Câu trả lời:


297

Khi bạn thực hiện một yêu cầu đồng bộ, điều đó sẽ là

function getRemote() {
    return $.ajax({
        type: "GET",
        url: remote_url,
        async: false
    }).responseText;
}

Ví dụ - http://api.jquery.com/jQuery.ajax/#example-3

XIN LƯU Ý: Đặt thuộc tính async thành false sẽ không được chấp nhận và đang trong quá trình xóa ( liên kết ). Nhiều trình duyệt bao gồm Firefox và Chrome đã bắt đầu in cảnh báo trong bảng điều khiển nếu bạn sử dụng:

Trình duyệt Chrome:

XMLHttpRequest đồng bộ trên luồng chính bị phản đối vì những tác động bất lợi của nó đối với trải nghiệm của người dùng cuối. Để được trợ giúp thêm, hãy kiểm tra https://xhr.spec.whatwg.org/ .

Firefox:

XMLHttpRequest đồng bộ trên luồng chính bị phản đối vì những tác động bất lợi của nó đối với trải nghiệm của người dùng cuối. Để được trợ giúp thêm http://xhr.spec.whatwg.org/


16
Lưu ý rằng responseTextluôn trả về một chuỗi. Nếu bạn đang mong đợi JSON, quấn $.ajaxvới JSON.parse.

6
Lưu ý: xhr.spec.whatwg.org/#the-open()-method Yêu cầu đồng bộ bị phản đối ...
teynon

5
@Tom Và như vậy là <i><b>các thẻ. Đề nghị của tôi: tiếp tục sử dụng các tính năng này để chúng không biến mất.
Stijn de Witt

1
vì điều này khóa trình duyệt, nên thêm thời gian chờ: 5000 hoặc hơn vào các tùy chọn.
phổ biến

1
@usandfriends Đối với chuỗi phân tích cú pháp đối tượng sẽ an toàn hơn khi sử dụng jQuery.parseJSON thay vì JSON.parse stackoverflow.com/questions/10362277/
Lỗi

33

Bạn đang sử dụng chức năng ajax không chính xác. Vì nó đồng bộ nên nó sẽ trả về dữ liệu nội tuyến như vậy:

var remote = $.ajax({
    type: "GET",
    url: remote_url,
    async: false
}).responseText;

17

url đó từ xa như thế nào? Có phải từ cùng một tên miền? mã trông ổn

thử cái này

$.ajaxSetup({async:false});
$.get(remote_url, function(data) { remote = data; });
// or
remote = $.get(remote_url).responseText;

Vâng! Cùng một tên miền và mọi thứ. remote_urlđược xác định đúng và cuộc gọi AJAX được thực hiện đúng như đã đề cập (được điều khiển bằng con bọ lửa). Chỉ là không trở về!
Công nghiệp

3
function getRemote() {
    return $.ajax({
        type: "GET",
        url: remote_url,
        async: false,
        success: function (result) {
            /* if result is a JSon object */
            if (result.valid)
                return true;
            else
                return false;
        }
    });
}

7
Vui lòng bao gồm một số giải thích về lý do tại sao điều này sẽ giúp OP.
krillgar

Đó là một thực hành tốt để trả về một đối tượng json từ phía máy chủ. Nó cho phép bạn kiểm soát nhiều hơn. Nhưng, bạn cần thêm dataType: "json" vào các tham số $ .ajax ở trên.
jjwdesign

Điều này có nghĩa là gì: "Nó cho phép bạn kiểm soát nhiều hơn"?
Grantwparks

3
Không liên quan nhưng bạn có thể: trả về kết quả.valid; // Đây đã là một boolean
dpineda
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.