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

有帮助吗?

解决方案

你有一些不同的错误。首先,$ .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;
}

但是,你可能会更好地服务,找出如何在回调函数本身中做你想做的事情,而不是从异步调用变为同步调用。

其他提示

你所犯的根本错误是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); 
    });
}

看起来你想要同步请求: 我怎样才能获得jQuery执行同步而不是异步的Ajax请求?

或者,您可能希望将回调传递给您的函数:

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

showGetResult("John", function(data){ alert(data); });

根本错误是“异步”错误。 AJAX的一部分。因为你不知道服务器发回一个响应需要多长时间,所以AJAX方法永远不会“阻塞”。 - 也就是说,您不会呼叫服务器,只是坐在那里等待结果。相反,你继续做其他事情,但是你设置了一个叫做“回调”的方法,它会在结果返回时触发。这种方法负责做任何需要处理的数据(例如将其注入页面)。

这是错误的做法。函数(data)是一个回调函数,所以只要返回$ .get 就会执行..有可能没有调用回调函数。

最好从函数(数据)方法调用post数据获取函数。

一种有效的方法是使用jQuery的Deferred方法,同步/异步请求到服务器并等待deferred.resolve()然后返回延迟的promise对象。看起来有点乏味,但一点点研究肯定对大数据有用。 (在这种情况下,tvanfosson的功能运行良好,但当我处理谷歌分析数据时,大量信息让我发疯,因此我需要找到这个解决方案)

     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();
            }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top