8

我一定犯了一个愚蠢的错误,但我无法返回从 $.post 函数获得的数据并将其存储在变量中,不仅如此,我无法从该函数中返回任何内容。例子:

function test(){

$.post("demo_test_post.asp",
    {
      name:"Donald Duck",
      city:"Duckburg"
    },
    function(data,status){
      return(data)
    });

}

var foo = test()
alert(foo)

它说 foo 是未定义的。但更进一步,即使我这样做:

function test(){

    $.post("demo_test_post.asp",
        {
          name:"Donald Duck",
          city:"Duckburg"
        },
        function(data,status){

          var bar = "bar"
          return(bar)
        });

    }

    var foo = test()
    alert(foo)

它仍然说 foo 是未定义的......我一定做错了什么或误解了什么。有人可以帮忙吗。

谢谢

4

6 回答 6

13

$.post 是一个异步函数。来自函数的控件将在运行 post 后立即返回,但可能稍后会收到来自 post 的响应。

因此,您可以做的不是返回,而是使用回调函数并在外部定义回调函数。

说,

function test(){

  $.post("demo_test_post.asp",
    {
      name:"Donald Duck",
      city:"Duckburg"
    },
    function(data,status){
      my_function(data)
    });

}

function my_function(data){
  // you can operate on data here
}
于 2013-06-07T15:35:31.560 回答
4

您不会从post(). 你所拥有function(data, status) {}的实际上是一个回调,并不会post()像你想象的那样将结果返回给方法。

阅读本文以获取更多信息

于 2013-06-07T15:34:17.847 回答
4

默认情况下, jQuerypost()异步的,这意味着您永远不能从这样的函数返回值。

引用jQuery 文档

异步(默认值:true)

类型:布尔值

默认情况下,所有请求都是异步发送的(即默认设置为true)。如果您需要同步请求,请将此选项设置为 false。

您需要提供一个回调函数才能更新该值。

例如一个非常基本的例子。

var foo;
test();    

function test(){    
    $.post("demo_test_post.asp",
        {
          name:"Donald Duck",
          city:"Duckburg"
        },
        function(data,status){

          var bar = "bar"
          foo = bar; // assign foo

        });    
    }    
}

或者,您可以查看将 jQuery Ajax 更改为Synchronous。在这里查看这篇文章如何让 jQuery 执行同步而不是异步的 Ajax 请求?

于 2013-06-07T15:37:52.140 回答
4

尝试使用 .done() 来执行返回的数据。这应该确保它获取数据并且在完成之前不会设置您的变量或警报数据。

$.post("demo_test_post.asp", { name: "Donald Duck", city: "Duckburg" })
.done(function(data) {
  alert("Data Loaded: " + data);
  //Or return data;
});
于 2013-06-07T15:38:02.433 回答
2

jQuery AJAX 请求是异步发出的,这意味着请求已启动并且$.post()方法或多或少会立即返回。该请求由浏览器在后台处理。当请求完成时,jQuery 调用你提供给$.post(). 您可以使用async: falsejQuery 来阻止直到请求完成,但不推荐这样做,因为它几乎肯定会导致糟糕的性能和糟糕的用户体验。

相反,您应该做的是编写代码,以便依赖于 AJAX 响应的逻辑由您的回调函数启动。就像是:

function handleAjaxResponse(responseData) {
  // do something with the response.
}

function doAjax() {

  $.post("demo_test_post.asp",
    {
      name:"Donald Duck",
      city:"Duckburg"
    },
    function(data, status){
      handleAjaxResponse(data);
    });

}

doAjax();
于 2013-06-07T15:42:47.527 回答
1

您正在使用更简化的.post()方法。这既更挑剔(恕我直言),也没有更大的形式强大,$.ajax().

就个人而言,我发现该.ajax()方法更可取,因为添加的结构使其更易于格式化。此外,您可以做更多事情.ajax(有更多选项,例如关闭异步,当您想要延迟处理直到数据返回时,这有时非常有用)。

这是一个使用完整$.ajax()方法的简单示例。请注意success底部的函数——您可以在此处使用从其他 PHP 文件发回的数据!

于 2013-06-07T15:46:25.770 回答