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

Kai*_*Kai 33 jquery xmlhttprequest

我正在尝试调用包含jQuery代码的函数.我希望这个函数返回jQuery语句的结果.它没有用,我正在试图找出原因.

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

alert (showGetResult("John"));
Run Code Online (Sandbox Code Playgroud)

警报显示" [object XMLHttpRequest]." 但是,如果我在函数之外单独运行jQuery语句,它可以正常工作 - >$.get(scriptURL, {}, function(data) { alert(data); })

我希望能够通过将其放在返回$.get数据的函数内来重用此代码.我在这里犯了什么根本错误?

tva*_*son 94

你有几个不同的错误.首先,$ .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;
}
Run Code Online (Sandbox Code Playgroud)

但是,您可能会更好地服务,找出如何在回调函数本身中执行您想要的操作,而不是从异步调用更改为同步调用.

  • 这很好,但请注意,通过切换到同步,您可能会导致浏览器在等待响应时锁定.这可能是一个错误,除非您知道您的用户将始终处于快速连接状态,并且您的服务器永远不会被淹没.这也与AJAX的所有相反 - 它旨在使Web应用程序更具响应性,但这种变化可能会使您的响应性降低. (5认同)
  • 感谢您的彻底分解。切换到同步并使用外部作用域中的变量来传递数据的组合解决了我的问题。 (2认同)
  • 大约五年后,我不得不回来对自己使用同步而不是异步进行评论。我是多么无知啊。;-) (2认同)

Dar*_*rov 8

你所犯的根本错误是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); 
    });
}
Run Code Online (Sandbox Code Playgroud)

  • 任务是返回这个“数据”结果,而不是从服务器加载时打印它。 (2认同)

que*_*en3 6

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

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

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

showGetResult("John", function(data){ alert(data); });
Run Code Online (Sandbox Code Playgroud)