为什么我不能从$ .post(jquery)返回数据

时间:2013-06-07 15:31:35

标签: jquery post

我一定是犯了一个愚蠢的错误,但是我无法返回我从$ .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未定义......我必须做错事或误解某事。有人可以帮忙。

由于

6 个答案:

答案 0 :(得分:12)

$ .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
}

答案 1 :(得分:3)

您不会从post()返回任何内容。 function(data, status) {}中的内容实际上是一个回调函数,并且不会像您想象的那样将结果返回给post()方法。

阅读this article以获取更多信息

答案 2 :(得分:3)

jQuery post()默认为异步,这意味着您永远不能从这样的函数返回值。

引用jQuery Docs

  

async (默认值:true)

     

类型:布尔值

     

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

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

e.g。一个非常基本的例子。

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更改为同步。在这里看一下这篇文章How can I get jQuery to perform a synchronous, rather than asynchronous, Ajax request?

答案 3 :(得分:2)

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

$.post("demo_test_post.asp", { name: "Donald Duck", city: "Duckburg" })
.done(function(data) {
  alert("Data Loaded: " + data);
  //Or return data;
});

答案 4 :(得分:1)

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

你应该做的是编写代码,使得依赖于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();

答案 5 :(得分:1)

您正在使用更精简的.post()方法。与(IMHO)合作更加挑剔,而且比较大的形式$.ajax()更不强大。

就个人而言,我发现.ajax()方法更受欢迎,因为添加的结构使格式化更容易。此外,您可以使用.ajax执行更多操作(还有更多选项,例如关闭异步,当您想要延迟处理直到返回数据时,这有时非常有用。)

Here is a simple example使用完整的$.ajax()方法。请注意底部的success函数 - 您可以使用从其他PHP文件发回的数据!