我正在尝试调用包含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
数据的函数内来重用此代码。我在这里犯了什么根本错误?
答案 0 :(得分:93)
你有一些不同的错误。首先,$ .get不返回回调函数的返回值。它返回XHR对象。其次,get函数不是同步的,它是异步的,因此showGetResult可能会在完成之前返回。第三,你不能从回调内部向外部范围返回一些东西。但是,您可以在外部作用域中绑定变量并将其设置在回调中。
要获得所需的功能,您需要使用$ .ajax并将async选项设置为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 :(得分: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);
});
}
答案 2 :(得分:6)
看起来你想要同步请求: How can I get jQuery to perform a synchronous, rather than asynchronous, Ajax request?
或者,您可能希望将回调传递给您的函数:
function showGetResult (name, callback) {
var scriptURL = "somefile.php?name=" + name;
return $.get(scriptURL, {}, callback);
}
showGetResult("John", function(data){ alert(data); });
答案 3 :(得分:2)
基本错误是AJAX的“异步”部分。因为您不知道服务器发回响应所需的时间,所以AJAX方法永远不会“阻塞” - 也就是说,您不会呼叫服务器而只是坐在那里等待结果。相反,你继续做其他事情,但是你设置了一个叫做“回调”的方法,当结果回来时它会触发。这种方法负责做任何需要处理的数据(例如将其注入页面)。
答案 4 :(得分:1)
这是错误的做法。函数(data)是一个回调函数,所以只要返回$ .get 就会执行..有可能没有调用回调函数。
最好从函数(数据)方法调用post数据获取函数。
答案 5 :(得分:0)
一种有效的方法是使用jQuery的Deferred方法,将同步/异步请求发送到服务器并等待deferred.resolve(),然后返回延迟的Promise对象。看起来有点乏味,但是稍作研究对大数据肯定有帮助。 (tvanfosson的功能在这种情况下效果很好,但是当我使用Google Analytics(分析)数据时,大量信息使我发疯,因此我需要找到这种解决方案)
function showResults(name) {
var deferred = $.Deferred, requests = [];
requests.push($.ajax({url:"/path/to/uri/?name=" + name, type: "GET", async: false}).done(function(d) {
//alert or process the results as you wish
}));
$.when.apply(undefined, requests).then(function() { deferred.resolve(); });
return deferred.promise();
}
返回的Promise对象也可以与$.when(showResults('benjamin')).done(function() { });
一起用于后期修改(如图表/图形设置等)。完全可重用。
您也可以将此函数放入$ .deferred请求的循环中,例如
function updateResults() {
var deferred = $.Deferred, requests = [];
requests.push($.ajax(url:"/path/to/names/?nameArr=" + jsonArrOfNames, type: "GET", async: false}).done(function(res) { requests.push(showResults(res[0]));}) );
$.when.apply($, requests).then(function() { deferred.resolve(); });
return deferred.promise();
}