【问题标题】:$.ajax, $.post or $.get won't function, cannot use the response [duplicate]$.ajax、$.post 或 $.get 不起作用,无法使用响应 [重复]
【发布时间】:2012-06-21 21:09:35
【问题描述】:

可能重复:
return AJAX callback return

我已经使用 AJAX 制作了一个 JQuery 代码,但尽管我付出了所有努力(尝试 $.post$.get $.ajax)我无法得到任何响应,也无法在我的代码。 示例代码:

var r = $.post("ajaxpage.php", function(data) {return data});
console.log(r); // nothing

【问题讨论】:

  • @Cranio 因此,您没有将提问者与这四个问题之一联系起来,而是决定通过提供五分之一来进一步搅浑水?
  • 然后在其他地方这么长地回答它,或者编辑你的旧帖子,或者,其他什么。真的没必要提这个问题。它让我和@Blazemonger 一样困扰。
  • @Cranio - 我认为你有点错过了 SO。如果您有问题的答案,请将其发布在问题上。如果您找到了自己问题的解决方案,则可以自行回答。 SO 不是一个编程博客网站。
  • 仅代表我自己,我希望您 (a) 放大您现有的答案之一,并 (b) 将来经常链接到它。这是关于 SO 的一种行之有效的做法,我认为这比“写博客”一个新问题要好。
  • 毫无疑问是 ;)。无论如何,有很多可能的方法来分享这个答案。 (同样,答案本身非常好,所以保持这种质量。)

标签: javascript jquery ajax


【解决方案1】:

初学者程序员对 Javascript 和 AJAX 最常见的误解之一是将 AJAX 请求视为“正常”函数,进行变量赋值或期望在其代码中立即使用 AJAX 响应。

但这不是它的工作原理;让我们尝试了解正确的实现是如何工作的。

AJAX 代表 异步 JavaScript 和 XML

我们将暂时忽略 XML 部分(更多关于请求是如何进行的,通过XMLHttpObject),Javascript 位非常明显(这是我们使用的脚本语言,有或没有 JQuery),让我们关注异步

以这种方式思考 AJAX:它大致就像您在工作时向同事发送工作电子邮件并提供一些信息;并要求采取行动和/或其他信息作为回报;无论您的朋友是否立即回答,您仍然必须继续工作,因为回答可能会延迟(您的朋友今天可能特别忙)。 当您的朋友回答相关信息时,只有那么您才会解决问题并采取适当的行动。如果请求采取行动,您的同事只有在收到您的电子邮件后才会继续执行。

AJAX 以类似的方式工作:从客户端,您向服务器端页面发出请求,并期望得到一个action(例如在数据库中写入一行)或 response(从您正在调用的页面在服务器端获取的一些数据。

重要的是,无论往返是否完成,您的 JavaScript 代码都会继续执行,因为当您的客户端(请记住,JS 运行在客户端)时,可能会有很大的延迟对服务器进行 AJAX 调用(服务器速度慢、连接速度慢等)。

所以你不能指望做这样的事情:

var r = $.post("ajaxpage.php", function(data) {return data});

因为 $.post 实际上并没有像“常规”函数那样“返回”一个值,所以变量 r 不能被 $.post 赋值

相反,您应该根据 done 事件组织代码,该事件在 AJAX 调用完成后触发:它保证(如果没有失败,例如服务器端错误,未找到页面等),我们实际上有一个响应可以在您的代码中使用成功。 通过该事件,我们可以调用一个函数,该函数接收响应作为参数并实际使用它。

$.post("ajaxpage.php").done(useMyResponse);
// rest of the code

function useMyResponse(response)
{
    // do fancy things with the response like:
    console.log(response); // works!
    // or maybe
    $("#someElement").html(response);
}

对此的简写是:

$.post("ajaxpage.php",function (response) { 
     // use response
     console.log(response);
});

编辑:我的母语不是英语,请原谅我的错误。

【讨论】:

  • 指出一些事情以避免误解,$.post 返回一些东西,一个 Deferred 对象,它承载了几种方法来处理由于异步操作导致的“延迟”结果,其中之一是 .done()
猜你喜欢
  • 2012-01-23
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 2012-05-31
相关资源
最近更新 更多