jQuery ajax成功回调函数定义


89

我想使用jQuery ajax从服务器检索数据。

我想将成功回调函数定义放在如下所示的代码.ajax()块之外。因此,是否需要dataFromServer像下面这样声明变量,以便能够使用成功回调中返回的数据?

我已经看到大多数人在.ajax()块内定义成功回调。如果我想在外部定义成功回调,那么以下代码正确吗?

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
}

Answers:


93

只需使用:

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

success属性仅需要引用一个函数,并将数据作为参数传递给该函数。

handleData由于handleData声明的方式,您可以像这样访问您的函数。JavaScript将在运行之前解析您的代码以进行函数声明,因此您可以在实际声明之前的代码中使用该函数。这称为吊装

但是,这对于声明为这样的函数不起作用:

var myfunction = function(){}

这些仅在口译员通过时才可用。

有关此2种声明函数的方式的更多信息,请参见此问题。


1
@Alnitak,什么时候deferred objects开始介绍的?我没看过 而且,由于定义要使用的回调的代码与实际的AJAX调用位于不同的位置,因此似乎有些混乱。
Cerbrus 2013年

4
它是在jQuery 1.5中引入的,它的混乱程度小于使用success:。从AJAX解耦回调是一个东西!请参阅我刚刚在答案末尾添加的注释。
Alnitak

@Alnitak,我来看一下。让我们看看我是否可以说服:P
Cerbrus

@Alnitak:延迟对象总是优先于成功回调吗?谢谢。
tonga 2013年

@tonga恕我直言,是的,非常受欢迎。$.get()例如,如果您的代码一直在使用,则不可能添加error:处理程序,因为$.get它不支持该处理程序。然而,你可以添加.fail到推迟的结果$.get
Alnitak

198

自jQuery 1.5(2011年1月)以来,这样做的“新”方法是使用延迟对象而不是传递success回调。您应该返回的结果$.ajax,然后使用.done.fail等方法来添加回调外的$.ajax呼叫

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

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

getData().done(handleData);

使回调处理与AJAX处理脱钩,允许您添加多个回调,失败回调等,而无需修改原始getData()功能。将AJAX功能与随后要完成的操作分开是一件好事!

延迟还可以使多个异步事件的同步更加轻松,而仅通过以下方法就很难做到这一点 success:

例如,我可以添加多个回调,一个错误处理程序,并等待计时器过去后再继续:

// 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
});

jQuery的其他部分也使用延迟对象-您可以轻松地将jQuery动画与其他异步操作同步。


1
@Cerbrus看到新示例,然后考虑如何在不使用延迟对象的情况下进行操作
Alnitak

@jbl延迟对象很棒。我通常不赞成提倡使用的任何答案,success:因为延期会更好地工作。
Alnitak

@Cerbrus正是应该被解释的方式。建议你搜索这里user:6782 deferred很多更多的例子。
Alnitak

一个表单提交事件该如何利用呢?
haakym 2015年

alert虽然...我会亲自使用,console.log(data)或者如果它是一个数组:console.table(data):)
Armstrongest

16

我不知道您为什么要在脚本之外定义参数。那是没有必要的。您的回调函数将自动以返回数据作为参数来调用。很有可能在sucess:ie 外部定义回调

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

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

handleData函数将被调用,而ajax函数会将参数传递给该函数。


6

尝试将您的成功处理程序重写为:

success : handleData

ajax方法的成功属性仅需要引用一个函数。

在handleData函数中,最多可以使用3个参数:

object data
string textStatus
jqXHR jqXHR

5

我会写:

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


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

15
您的代码从未真正使用过,dataFromServer因此可以删除第一行。
安东尼·格里斯

2

玩了几个小时,几乎变得乏味。奇迹来到了我,这行得通。

<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
您无需放置另一个函数调用即可成功。您可以直接说success : callbackjquery将触发callback其中带有data参数的函数。
Olgun Kaya'9


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.