【问题标题】:jQuery $.ajax success must be a callback function?jQuery $.ajax 成功一定是回调函数?
【发布时间】:2010-03-28 00:40:35
【问题描述】:

我为 jQuery 的 $.ajax() 方法创建了一个包装函数,因此我可以传递不同的数据类型和发布变量 - 如下所示:

function doPost(dType, postData, uri){

    $.ajax({
        url: SITE_URL + uri,
        dataType: dType,
        data: postData,
        success: function(data){
          return data;
        });
}

我遇到的问题是将数据(始终是 JSON)取回。我尝试在 $.ajax() 函数调用之前设置var ret 并在成功函数中将其设置为ret = data。我在这件事上很愚蠢吗?如果我不设置成功函数,$.ajax 会简单地返回数据吗?还是只是success: return data?还是success 需要一个回调函数来处理数据,可能只是return data

【问题讨论】:

    标签: javascript jquery ajax


    【解决方案1】:

    好吧,你在一个函数内部——利用变量作用域;-)

    function doPost(dType, postData, uri) { 
        var result;
        $.ajax({ 
            url: SITE_URL + uri, 
            dataType: dType, 
            data: postData, 
            async: false,
            success: function(data){ 
              result = data;
            }); 
        return result;
    } 
    

    这确实有效,但我猜async 部分是强制性的...否则$.ajax 的调用将立即返回,而result 仍将未定义-您将始终得到undefined 作为结果你的函数调用。

    但是,当您使$.ajax 调用同步时,它会阻塞直到接收到数据,您可以将数据作为您自己函数的result 返回。

    但是你要清楚,在使用这个方法的时候,在ajax加载完成之前不会执行其他代码!

    【讨论】:

    • 这样做意味着您停止任何其他代码执行,直到 ajax 请求返回。
    • 这就是同步调用的本质,那又怎样...?这是批评吗?
    • 没有批评只是一个注释。您尚未将注释添加到您对此的回答中
    • 好的,将其添加到 anwser 中:-)
    • 异步是关键 - 遇到此问题/答案的任何人都需要注意的另一件事 - 您需要(安全地)评估返回的数据对象,因为在 $.ajax() 函数之外,您的脚本不知道数据是 JSON。我个人使用了 jQuery JSON 插件。
    【解决方案2】:

    当您调用 $.ajax() 时,它会创建请求,然后继续下一步。它不会坐在那里等待返回并阻止下一行代码。这意味着除非成功回调函数不能为doPost函数返回数据值。

    如果你真的想要一个包装函数,那么你可以这样做:

    function doPost(dType, postData, uri, success){
        $.ajax({
            url: SITE_URL + uri,
            dataType: dType,
            data: postData,
            success: success
        });
    }
    

    并在您调用 doPost 时定义您的成功处理程序,但此时包装函数实际上并没有为您做太多事情。

    【讨论】:

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