【问题标题】:How can I return an AJAX-retrieved value to the parent function of the current function in JavaScript?如何将 AJAX 检索到的值返回给 JavaScript 中当前函数的父函数?
【发布时间】:2010-11-30 12:27:52
【问题描述】:

我有以下 JavaScript(和 jQuery)代码:

function checkEmail(email) {
    if (email.length) {
        $.getJSON('ajax/validate', {email: email}, function(data){
            if (data == false) {
                // stuff
            }
            return data;
        })
    }
}

我希望匿名函数 return data 到父函数 checkEmail()。我试着做这样的事情:

function checkEmail(email) {
    if (email.length) {
        var ret = null;
        $.getJSON('ajax/validate', {email: email}, function(data){
            if (data == false) {
                // stuff
            }
            ret = data;
        })
        return ret;
    }
}

但这当然行不通,因为$.getJSON() 调用是异步的,所以它会在 GET 请求完成之前return ret

这里有什么想法吗?

谢谢!

【问题讨论】:

  • 我每天都会在这里多次看到同样的问题。在了解 AJAX 的工作原理之前,请不要开始编写 AJAX!
  • 然后人们投票赞成这个问题,而不是像他们应该的那样关闭它作为重复。
  • FWIW,这是作为 stackoverflow.com/questions/1094716/… 的副本被关闭的,它问的问题几乎相同。

标签: javascript jquery ajax


【解决方案1】:

通常,处理此类问题的最佳方法是使用某种形式的回调函数。实际上,这确实是唯一可行的解​​决方案——唯一的其他选择是编写您自己的浏览器扩展程序,这有点多(除非您真的喜欢用头撞墙)。这些板上实际上有很多平行的问题:您可以尝试搜索一些,很多都非常好。

修改你的代码:

function checkEmail(email) {
    /*
        original parts of the function here!
    */

    if (email.length) {
        $.getJSON('ajax/validate', {email: email}, function(data){
            if (data == false) {
                // stuff
            }
            checkEmailResponse( data );
        })
    }
}

function checkEmailResponse( data )
{
    // do something with the data.
}

【讨论】:

    【解决方案2】:

    您还应该使用回调,因为调用是异步的,因此围绕该想法设计您的整个 JavaScript 源代码(正如其他人指出的那样)。

    如果你真的需要将它作为返回值,你需要关闭异步调用,但完全不推荐这样做,因为它会阻塞页面直到响应出现。

    function checkEmail(email, callback) {
        if (email.length) 
        return $.ajax({
          data:  {email: email},
          url: 'ajax/validate',
          async: false
         }).responseText; // only the raw response text of the XMLHttpRequest
        }
    }
    

    【讨论】:

      【解决方案3】:

      您可以拥有父功能块,直到那里有东西。为了减少 CPU 密集度,您可以使用某种超时。

      function checkEmail(email) {
      if (email.length) {
          var ret = null;
          $.getJSON('ajax/validate', {email: email}, function(data){
              if (data == false) {
                  // stuff
              }
              ret = data;
          }) 
         while(ret == null){
      
         }
         return ret;
      }
      

      }

      希望这会有所帮助。

      【讨论】:

        【解决方案4】:

        您只需要改变处理问题的方式。你知道你上面的东西是行不通的,所以你不能用“调用函数并对其返回值进行操作”来思考。

        您需要切换到类似于 toby 对 CPS 的建议,或者根据触发此功能的原因,使用自定义事件处理它。

        【讨论】:

          猜你喜欢
          • 2016-11-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-10
          • 1970-01-01
          相关资源
          最近更新 更多