jQuery ajax 成功回调函数定义

IT技术 javascript jquery ajax
2021-01-28 03:08:22

我想使用 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
}
6个回答

自 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 功能与之后要完成的一组操作分开是一件好事!.

Deferreds 还允许更容易地同步多个异步事件,这是你不能轻易做到的 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 动画与其他异步操作同步。

@Cerbrus 这正是它应该被解释的方式。建议你搜索这里user:6782 deferred很多更多的例子。
2021-03-17 03:08:22
alert虽然...我个人使用console.log(data),或者如果它是一个数组:console.table(data):)
2021-03-24 03:08:22
@Cerbrus 查看新示例,然后考虑如何在没有延迟对象的情况下执行此操作
2021-03-27 03:08:22
@jbl 延迟对象很棒。通常会拒绝任何促进使用的答案,success:因为延迟只是工作得更好。
2021-03-30 03:08:22
如何在表单提交事件中使用它?
2021-04-07 03:08:22

只需使用:

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

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

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

不过,这不包括这样声明的函数:

var myfunction = function(){}

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

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

@Alnitak,这deferred objects东西是什么时候介绍的?我以前没见过。此外,它看起来有点乱,因为定义要使用的回调的代码与实际的 AJAX 调用位于不同的位置。
2021-03-25 03:08:22
@Alnitak,我去看看。让我们看看我是否能被说服:P
2021-03-31 03:08:22
它是在 jQuery 1.5 中引入的,没有使用success:. 从AJAX解耦回调是一个东西!请参阅我刚刚添加到答案末尾的注释。
2021-04-06 03:08:22
@Alnitak:延迟对象总是优先于成功回调吗?谢谢。
2021-04-06 03:08:22
@tonga 恕我直言,是的,非常喜欢。$.get()例如,如果您的代码一直在使用,则不可能添加error:处理程序,因为$.get不支持它。但是,您可以将 a 添加.fail到 的延迟结果$.get
2021-04-06 03:08:22

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

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

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

handleData 函数将被调用,参数由 ajax 函数传递给它。

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

success : handleData

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

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

object data
string textStatus
jqXHR jqXHR

我会写:

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


function getData() {
    $.ajax({
        url : 'example.com',
        type: 'GET',
        success : handleData
    })
}
您的代码从未真正使用过,dataFromServer因此可以删除第一行。
2021-03-16 03:08:22