【问题标题】:return from jquery ajax call从 jquery ajax 调用返回
【发布时间】:2011-02-20 03:37:31
【问题描述】:

我正在尝试在我自己的函数中使用 jQuery ajax 调用的返回值,但它一直返回未定义。

function checkUser2(asdf) {
    $.ajax({
        type: "POST",
        async: false,
        url: "check_user.php",
        data: { name: asdf },
        success: function(data){ 
            return data;
            //alert(data);
        }
    });  
}

$("#check").click(function(){
    alert(checkUser2("muma"));
});

ajax 调用绝对有效,因为当我取消注释我的警报时,我得到了正确的返回,并且我可以在 firebug 中看到它。我在做傻事吗?

【问题讨论】:

    标签: jquery ajax return-value


    【解决方案1】:

    AJAX 调用是异步的 - 这意味着 AJAX 请求在通常的程序执行中是无序的,并且在您的程序中这意味着 checkUser2() 没有向警报返回数据。

    您不能以这种方式使用来自 $.ajax() 调用的返回值,而是将利用 AJAX 返回数据的代码移动到 success() 函数 - 这就是它的用途。

    【讨论】:

      【解决方案2】:

      试试这个:

       function checkUser2(asdf) {
          var result;
          $.ajax({
              type: "POST",
              async: false,
              url: "check_user.php",
              data: { name: asdf },
              success: function(data){ 
                  result = data;            
              }
          });
          return result;  
      }       
      
      
      $("#check").click(function(){
          alert(checkUser2("muma"));
      });
      

      您可能不得不将结果变量作为全局 javascript 变量移出。我还没有测试过。

      【讨论】:

      • 然而,同步 ajax 是一个非常糟糕的主意。
      • 我同意,但这是解决 OP 问题的一种方法。而且他已经在以异步方式使用 ajax 函数了。
      • 这种方式对我也不起作用。 $("#submitPO").click(function(){ alert(updatePO("444")); });未能弹出警报。我的职能结构和你的一样。
      【解决方案3】:

      我认为你可以这样做:

      function checkUser2(asdf) {
        var s = $.ajax({
              type: "POST",
              async: false,
              url: "check_user.php",
              data: { name: asdf },
              success: function(data){ 
                  return data;
                  //alert(data);
              }
          }).responseText;  
         return s;
      }       
      

      但是,正如jquery doc page for ajax function 的第四个例子所说,我认为

      在请求处于活动状态时阻止浏览器。当需要同步时,最好通过其他方式阻止用户交互。

      【讨论】:

      • 这解决了我在几乎完全相同的情况下遇到的问题,因为“async: false”是停止异步调用的关键部分。
      【解决方案4】:

      您还可以使用 jQuery 的 data 方法存储“数据”并将其与全局 jQuery 对象或本地 jQuery 选择器相关联。例如

      success: function(data) {
        $.data('result', data);
      }
      

      返回值可以在任何地方使用

      $.data('result')
      

      您还可以将其关联到一个局部变量(例如 $('#myid').data()),以便它是该对象的本地变量,而不是全局范围。

      【讨论】:

      • 我尝试使用您的建议。我无法让它工作。 $("#submitPO").click(function(){ alert($.data('result')); });什么也没做。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 2013-10-04
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多