使用jQuery在函数中返回$ .get数据

时间:2009-10-28 19:32:52

标签: jquery xmlhttprequest

我正在尝试调用包含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数据的函数内来重用此代码。我在这里犯了什么根本错误?

6 个答案:

答案 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();
            }