【问题标题】:callback function not executed in jquery回调函数未在 jquery 中执行
【发布时间】:2013-08-15 19:43:39
【问题描述】:

我正在学习在 jquery 中发送获取请求。以下是发出 get 请求的代码块。我在我的 servlet 中检查了 get 请求已成功发出,但未调用回调函数。我无法弄清楚问题所在。

$.get('http://localhost:8080/PC_controlo/StatusServlet?id=1001',
function(data){
alert('hello');
});

浏览器的网络标签显示了这个

[01:21:26.759] GET http://localhost:8080/PC_controlo/StatusServlet?id=1001 [HTTP/1.1 200 OK 1ms]

+

这就是我在我的 servlet 中所做的。

PrintWriter out = response.getWriter();
            out.write("Working");
            out.close();

and .fail(msg){ alert('Failed with message:'+JSON.stringify(msg));给了以下信息

Failed with message: {"readyState":0,"responseText":"","status":0,"statusText":"error"}

提前致谢:)。

【问题讨论】:

  • 你检查过控制台吗?我希望看到同源错误。
  • 您是否在 chrome(或您使用的任何浏览器)中的开发者工具的网络选项卡中看到响应?
  • @dhsto 是的,我看到了回复,我也编辑了我的问题。
  • 响应的内容是否包含您所期望的内容?
  • @AlexWayne 是的,控制台中的一切似乎都很好。但是代码表现得很有趣:/

标签: javascript jquery callback get


【解决方案1】:

我用 Google.com 替换 URL 做了一些测试,但我遇到了同样的问题。我注意到如果你使用 .done()、.always() 和 .error(),你可能会更幸运地弄清楚到底发生了什么。看看这个 JSFiddle:

http://jsfiddle.net/gQfsd/

$.get('http://www.google.com/')
.done(function(data) {
    alert('Success! Data loaded: ' + data);   
})
.fail(function(msg) {
    alert('Failed with message: ' + JSON.stringify(msg));
})
.always(function() {
    alert('Always Alerts');
});

【讨论】:

  • 如果你检查控制台,你会看到一个非常明显的XMLHttpRequest cannot load http://www.google.com/. Origin http://fiddle.jshell.net is not allowed by Access-Control-Allow-Origin.
  • 如果他想通过他的警报而不是使用控制台查看发生了什么,我只是以这个为例,因为那是 OP 正在使用的。
【解决方案2】:

最可能的情况是你的请求没有成功完成,所以你的success处理函数回调没有被调用,因为没有成功。

根据jQuery docs$.get的成功处理函数是:(强调我的)

如果请求成功则执行的回调函数

为了更好地控制 AJAX 请求的错误处理,通常建议使用$.ajax,您可以使用read the documentation for here。这将允许您使用error 回调,该回调将在请求由于某种原因无法完成时触发。

$.get 只是一种快捷方法,它在幕后代表$.ajax


为什么您的请求失败了?没有线索。那是在您的浏览器和您正在与之交谈的服务器之间。这可能是一百万件事。检查浏览器开发控制台的网络选项卡,看看请求和响应是什么样的。

【讨论】:

  • 因为这个原因,没有必要跳到使用$.ajax()。您可以很容易地使用延迟方法,例如 .done().fail() 以保证 $.get() 返回;从这个意义上说,$.ajax() 没有什么特别之处
  • 这是一场风格辩论,但我认为除了最简单的情况外,$.ajax 是更好的选择,因为它非常清楚地说明了请求的设置方式。当您遇到$.get 便捷方法的限制时,自定义该请求会更容易。也许我只是老派:p
  • 我 100% 同意你的看法。我讨厌使用快捷方式,例如$.get$.post.click(func)(而不是.on("click", func)),我不知道为什么。我只是说我不认为您更改为 $.ajax() 的理由是正确的 - 我认为它没有任何“更好”的错误处理。
【解决方案3】:

可能是调用本身的通信错误,或者由于某种原因调用失败。也检查失败:

$.get('http://localhost:8080/PC_controlo/StatusServlet?id=1001')
 .success(function(result) {alert('success'); })
.error(function(jqXHR, textStatus, errorThrown) {alert(textStatus) });

【讨论】:

  • 但这东西有效
    localhost:8080/PC_controlo/StatusServlet"> 我得到所需的字符串作为输出
  • .success 和 .error 实际上应该是 .done 和 .fail。 .success 和 .error 已被弃用,并将在较新版本的 jQuery 中删除(如果还没有的话)。
  • @AshwinSurana 使用
    工作是无关紧要的,
    不受同源策略的约束,并且不需要数据采用任何特定格式。
  • @KevinB 感谢您的信息:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
  • 2011-08-22
  • 1970-01-01
  • 2022-12-08
  • 2019-11-09
  • 1970-01-01
相关资源
最近更新 更多