2009-10-28 101 views
33

我试图调用一个包含jQuery代码的函数。我想要这个函数返回jQuery语句的结果。它不工作,我试图找出原因。

function showGetResult (name) { 
    var scriptURL = "somefile.php?name=" + name; 
    return $.get(scriptURL, {}, function(data) { return data; }); 
} 

alert (showGetResult("John")); 

该警报显示“[object XMLHttpRequest]”。但是,如果我自己运行jQuery语句,除了函数,它可以正常工作 - >$.get(scriptURL, {}, function(data) { alert(data); })

我希望能够重新使用此代码,通过将其放入一个函数返回$.get数据。我在这里犯了什么根本错误?

回答

87

你有几个不同的错误。首先,$ .get不返回回调函数的返回值。它返回XHR对象。其次,get函数不同步,它是异步的,所以showGetResult在完成之前可能会返回。第三,你不能将回调中的东西返回到外部范围。但是,您可以绑定外部范围中的变量并将其设置在回调中。

要获得所需的功能,您需要使用$ .ajax并将异步选项设置为false。然后,您可以在外部范围中定义一个变量并将其分配给ajax回调函数,并从该函数返回该变量。

function showGetResult(name) 
{ 
    var result = null; 
    var scriptUrl = "somefile.php?name=" + name; 
    $.ajax({ 
     url: scriptUrl, 
     type: 'get', 
     dataType: 'html', 
     async: false, 
     success: function(data) { 
      result = data; 
     } 
    }); 
    return result; 
} 

你可能会得到更好的服务,但是,搞清楚如何做你在回调函数本身,而不是从异步切换到同步调用想要的东西。

+1

感谢彻底的破解。切换到同步和使用外部变量传递数据的组合已经解决了我的问题。 – Kai 2009-10-28 20:12:46

+5

这很好,但请注意,通过切换到同步,您可能会导致浏览器在等待响应时锁定。这可能是一个错误,除非你知道你的用户将永远在闪电般的连接和你的服务器永远不会被淹没。这也与AJAX的含义相反 - 它意味着让网络应用程序更具响应能力,但这种变化可能会使您的响应能力下降得更少。 – 2009-10-28 20:17:41

+0

我同意@JacobM最好是在所有可能的情况下使用异步,并在回调中处理您的操作。 – tvanfosson 2009-10-28 21:00:19

1

这是错误的做法。该函数(数据)是一个回调函数,所以无论何时返回$ .get将执行..有可能回调函数将不会被调用。

更好的是从函数(数据)方法调用您的发布数据获取函数。

9

您所犯的根本错误是AJAX调用是异步进行的,所以在您返回时,结果还没有准备好。为了使这项工作,你可以修改你的代码是这样的:

$(function() { 
    showGetResult('John'); 
}); 

function showGetResult (name) { 
    $.get('somefile.php', { 
     // Pass the name parameter in the data hash so that it gets properly 
     // url encoded instead of concatenating it to the url. 
     name: name 
    }, function(data) { 
     alert(data); 
    }); 
} 
+0

任务就是回到这个“数据”结果,而不是将其打印出来时,从服务器加载。 – Vlado 2017-09-13 20:19:59

2

最基本的错误是AJAX的“异步”部分。因为你不知道服务器发送回应需要多长时间,所以AJAX方法永远不会“阻塞” - 也就是说,你不会向服务器发出呼叫,只是坐在那里等待结果。相反,你继续进行其他工作,但是你建立了一个称为“回调”的方法,当结果回来时它会触发。这个方法负责处理数据的任何需要(例如将其注入页面)。