Định nghĩa hàm gọi lại thành công jQuery ajax


90

Tôi muốn sử dụng jQuery ajax để lấy dữ liệu từ máy chủ.

Tôi muốn đặt định nghĩa hàm gọi lại thành công bên ngoài .ajax()khối như sau. Vậy tôi có cần khai báo biến dataFromServernhư sau để có thể sử dụng dữ liệu trả về từ lần gọi lại thành công không?

Tôi đã thấy hầu hết mọi người định nghĩa lệnh gọi lại thành công bên trong .ajax()khối. Vì vậy, đoạn mã sau có đúng không nếu tôi muốn xác định lệnh gọi lại thành công bên ngoài?

var dataFromServer;  //declare the variable first

function getData() {
    $.ajax({
        url : 'example.com',
        type: 'GET',
        success : handleData(dataFromServer)
    })
}

function handleData(data) {
    alert(data);
    //do some stuff
}

Câu trả lời:


93

Chỉ dùng:

function getData() {
    $.ajax({
        url : 'example.com',
        type: 'GET',
        success : handleData
    })
}

Các successbất động sản chỉ đòi hỏi một tham chiếu đến một chức năng, và chuyển dữ liệu như tham số để chức năng này.

Bạn có thể truy cập handleDatahàm của mình như thế này vì cách handleDatađược khai báo. JavaScript sẽ phân tích cú pháp mã của bạn cho các khai báo hàm trước khi chạy nó, vì vậy bạn sẽ có thể sử dụng hàm trong mã trước khi khai báo thực tế. Điều này được gọi là cẩu .

Tuy nhiên, điều này không được tính cho các hàm được khai báo như thế này:

var myfunction = function(){}

Chúng chỉ có sẵn khi thông dịch viên thông qua chúng.

Xem câu hỏi này để biết thêm thông tin về 2 cách khai báo hàm


1
@Alnitak, deferred objectsthứ được giới thiệu khi nào vậy? Tôi chưa thấy nó bao giờ. Ngoài ra, nó có vẻ hơi lộn xộn, vì mã xác định lệnh gọi lại sẽ sử dụng nằm ở vị trí khác với lệnh gọi AJAX thực tế.
Cerbrus

4
nó đã được giới thiệu trong jQuery 1.5 và nó xa ít lộn xộn hơn là sử dụng success:. Tách lệnh gọi lại từ AJAX là một điều tốt ! Xem các ghi chú tôi vừa thêm vào cuối câu trả lời của mình.
Alnitak

@Alnitak, tôi sẽ xem qua. Chúng ta hãy xem nếu tôi có thể được thuyết phục: P
Cerbrus

@Alnitak: Đối tượng hoãn lại luôn được ưu tiên hơn là gọi lại thành công? Cảm ơn.
tonga

@tonga IMHO, vâng, rất thích. Nếu mã của bạn đã được sử dụng $.get()chẳng hạn, sẽ không thể thêm một error:trình xử lý vì $.getkhông hỗ trợ nó. Tuy nhiên, bạn có thể thêm a .failvào kết quả hoãn lại của $.get.
Alnitak

199

Cách "mới" để thực hiện việc này kể từ jQuery 1.5 (tháng 1 năm 2011) là sử dụng các đối tượng bị trì hoãn thay vì chuyển một lệnh successgọi lại. Bạn nên trả về kết quả của $.ajaxvà sau đó sử dụng các phương thức .done, .failvv để thêm các lệnh gọi lại bên ngoài $.ajaxcuộc gọi .

function getData() {
    return $.ajax({
        url : 'example.com',
        type: 'GET'
    });
}

function handleData(data /* , textStatus, jqXHR */ ) {
    alert(data);
    //do some stuff
}

getData().done(handleData);

Điều này tách việc xử lý gọi lại khỏi xử lý AJAX, cho phép bạn thêm nhiều lệnh gọi lại, lệnh gọi lại lỗi, v.v., tất cả mà không cần sửa đổi getData()chức năng ban đầu . Tách chức năng AJAX khỏi tập hợp các hành động sẽ hoàn thành sau đó là một điều tốt! .

Trì hoãn cũng cho phép đồng bộ hóa nhiều sự kiện không đồng bộ dễ dàng hơn nhiều, điều mà bạn không thể dễ dàng thực hiện chỉ với success:

Ví dụ: tôi có thể thêm nhiều lệnh gọi lại, một trình xử lý lỗi và đợi bộ đếm thời gian trôi qua trước khi tiếp tục:

// a trivial timer, just for demo purposes -
// it resolves itself after 5 seconds
var timer = $.Deferred();
setTimeout(timer.resolve, 5000);

// add a done handler _and_ an `error:` handler, even though `getData`
// didn't directly expose that functionality
var ajax = getData().done(handleData).fail(error);

$.when(timer, ajax).done(function() {
    // this won't be called until *both* the AJAX and the 5s timer have finished
});

ajax.done(function(data) {
    // you can add additional callbacks too, even if the AJAX call
    // already finished
});

Các phần khác của jQuery cũng sử dụng các đối tượng trì hoãn - bạn có thể đồng bộ hóa hoạt ảnh jQuery với các hoạt động không đồng bộ khác rất dễ dàng với chúng.


1
@Cerbrus xem ví dụ mới và sau đó xem xét cách bạn làm điều đó mà không có đối tượng bị trì hoãn
Alnitak

@jbl đối tượng bị trì hoãn thật tuyệt vời. Tôi thường từ chối bất kỳ câu trả lời nào khuyến khích việc sử dụng success:vì hoãn lại hoạt động tốt hơn rất nhiều.
Alnitak

@Cerbrus đó chính xác là cách nó phải được diễn giải. Đề nghị bạn tìm kiếm vào đây để user:6782 deferredcho rất nhiều các ví dụ khác.
Alnitak

Làm thế nào một người có thể sử dụng điều này với một sự kiện gửi biểu mẫu?
haakym

Đó là alertmặc dù ... Cá nhân tôi muốn sử dụng console.log(data)hoặc nếu nó là một mảng: console.table(data):)
Armstrongest

16

Tôi không biết tại sao bạn lại xác định tham số bên ngoài tập lệnh. Điều đó là không cần thiết. Hàm gọi lại của bạn sẽ tự động được gọi với dữ liệu trả về dưới dạng một tham số. Nó rất có thể để xác định gọi lại của bạn bên ngoài sucess:tức là

function getData() {
    $.ajax({
        url : 'example.com',
        type: 'GET',
        success : handleData
    })
}

function handleData(data) {
    alert(data);
    //do some stuff
}

hàm handleData sẽ được gọi và tham số được hàm ajax truyền cho nó.


6

Hãy thử viết lại trình xử lý thành công của bạn thành:

success : handleData

Thuộc tính thành công của phương thức ajax chỉ yêu cầu tham chiếu đến một hàm.

Trong hàm handleData, bạn có thể sử dụng tối đa 3 tham số:

object data
string textStatus
jqXHR jqXHR

5

Tôi sẽ viết :

var handleData = function (data) {
    alert(data);
    //do some stuff
}


function getData() {
    $.ajax({
        url : 'example.com',
        type: 'GET',
        success : handleData
    })
}

15
Mã của bạn không bao giờ thực sự sử dụng dataFromServerđể có thể xóa dòng đầu tiên.
Anthony Grist

2

Bạn không cần khai báo biến. Hàm thành công Ajax tự động nhận tối đa 3 tham số:Function( Object data, String textStatus, jqXHR jqXHR )


Không hiểu sao phải tìm một lúc mới tìm được những thông số mặc định đó. Cảm ơn!
payne

2

sau vài giờ chơi với nó và gần như trở nên buồn tẻ. phép màu đã đến với tôi, nó hoạt động.

<pre>


var listname = [];   


 $.ajax({
    url : wedding, // change to your local url, this not work with absolute url
    success: function (data) {
       callback(data);
    }
});

function callback(data) {
      $(data).find("a").attr("href", function (i, val) {
            if( val.match(/\.(jpe?g|png|gif)$/) ) { 
             //   $('#displayImage1').append( "<img src='" + wedding + val +"'>" );
                 listname.push(val);
            } 
        });
}

function myfunction() {

alert (listname);

}

</pre>

1
bạn không cần đặt lệnh gọi hàm khác để thành công. bạn có thể nói trực tiếp success : callbackjquery sẽ kích hoạt hàm của bạn được gọi callbackvới datatham số trong đó.
Olgun Kaya

-1

Trong thành phần của bạn, tức là mã JS góc cạnh:

function getData(){
    window.location.href = 'http://localhost:1036/api/Employee/GetExcelData';
}
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.