【问题标题】:jQuery ajax success callback function definitionjQuery ajax 成功回调函数定义
【发布时间】:2013-01-23 03:49:25
【问题描述】:

我想使用 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
}

【问题讨论】:

    标签: javascript jquery ajax


    【解决方案1】:

    自 jQuery 1.5(2011 年 1 月)以来执行此操作的“新”方法是使用延迟对象而不是传递 success 回调。您应该返回$.ajax 的结果,然后使用.done.fail 等方法将回调添加到$.ajax 调用之外。 p>

    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 动画与其他异步操作同步。

    【讨论】:

    • @Cerbrus 查看新示例,然后考虑如何没有延迟对象
    • @jbl 延迟对象非常棒。我通常对任何促进使用success: 的答案投反对票,因为延期的效果要好得多。
    • @Cerbrus 这正是它应该被解释的方式。建议您在此处搜索 user:6782 deferred 以获取 lots 更多示例。
    • 如何在表单提交事件中使用它?
    • 虽然 alert... 我个人会使用 console.log(data) 或者如果它是一个数组:console.table(data) :)
    【解决方案2】:

    只需使用:

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

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

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

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

    var myfunction = function(){}
    

    只有在解释器通过时才可用。

    See this question for more information about the 2 ways of declaring functions

    【讨论】:

    • @Alnitak,deferred objects 是什么时候引入的?我以前没见过。此外,它似乎有点混乱,因为定义要使用的回调的代码与实际的 AJAX 调用位于不同的位置。
    • 它是在 jQuery 1.5 中引入的,它比使用 success: 更容易。将回调与 AJAX 分离是一件的事情!请参阅我刚刚添加到答案末尾的注释。
    • @Alnitak,我去看看。让我们看看我是否可以说服:P
    • @Alnitak:延迟对象总是优先于成功回调吗?谢谢。
    • @tonga 恕我直言,是的,非常喜欢。例如,如果您的代码一直在使用$.get(),则不可能添加error: 处理程序,因为$.get 不支持它。但是,您可以.fail 添加到$.get 的延迟结果
    【解决方案3】:

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

    function getData() {
        $.ajax({
            url : 'example.com',
            type: 'GET',
            success : handleData
        })
    }
    
    function handleData(data) {
        alert(data);
        //do some stuff
    }
    

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

    【讨论】:

      【解决方案4】:

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

      success : handleData
      

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

      在您的 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
            })
        }
        

        【讨论】:

        • 您的代码实际上从未使用过dataFromServer,因此可以删除第一行。
        【解决方案6】:

        您不需要声明变量。 Ajax成功函数最多自动取3个参数:Function( Object data, String textStatus, jqXHR jqXHR )

        【讨论】:

        • 不知何故不得不寻找一段时间才能找到那些默认参数。谢谢!
        【解决方案7】:

        玩了几个小时后,几乎变得沉闷。奇迹出现在我身上,它奏效了。

        <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>
        

        【讨论】:

        • 你不需要为了成功而调用另一个函数。你可以直接说success : callback jquery 会触发你的函数callback 里面有data 参数。
        【解决方案8】:

        在您的组件中,即 Angular JS 代码:

        function getData(){
            window.location.href = 'http://localhost:1036/api/Employee/GetExcelData';
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-08
          相关资源
          最近更新 更多