Java 为什么单个Ajax调用可以正常工作,但是连续的Ajax调用失败了?
设置: 我有一个Datatable,它的每一行都是可点击的。单击一行时,将进行一个ajax调用,该调用将返回一些数据。有时ajax调用需要一点时间,具体取决于返回的数据量。一切正常 问题: 当一行接一行快速单击时,就会出现问题。简言之,在上一个ajax调用返回之前,如果单击该行(即进行了新的ajax调用),我将得到一个错误Java 为什么单个Ajax调用可以正常工作,但是连续的Ajax调用失败了?,java,ajax,jquery,jsonp,Java,Ajax,Jquery,Jsonp,设置: 我有一个Datatable,它的每一行都是可点击的。单击一行时,将进行一个ajax调用,该调用将返回一些数据。有时ajax调用需要一点时间,具体取决于返回的数据量。一切正常 问题: 当一行接一行快速单击时,就会出现问题。简言之,在上一个ajax调用返回之前,如果单击该行(即进行了新的ajax调用),我将得到一个错误 Uncaught TypeError: Property 'callback' of object [object Window] is not a function (
Uncaught TypeError: Property 'callback' of object [object Window] is not a function
(ajax调用返回一个JSONP数据)
看起来ajax调用不知何故混合在一起了(?),但我不确定这一点。谁能告诉我为什么会这样
如果需要更多信息来澄清问题,请告诉我
谢谢
编辑1:
以下是一些ajax代码:
$.ajax({
type: "GET",
url: 'http://' + myserver + ':8080/someurl/' + my_param,
contentType: "application/json",
dataType: "jsonp",
jsonpCallback: 'callback',
success: function(data) {
// Inside here, I am doing some Datatables stuff.
var myTable = $('#my_table').dataTable( {
"bJQueryUI" : true,
"bSort" : false,
"bFilter" : false,
"bPaginate": true,
"bProcessing": true,
"bScrollCollapse": true,
"bInfo": false,
"bDestroy": true,
"aaData": samples,
"sEmptyTable": "No sample listings avaiable",
"iDisplayLength": number,
"bLengthChange": false,
"bAutoWidth": false,
.
.
.
}
编辑2:
下面是分配回调
名称的类。如果默认回调为null,则它会指定一个默认值“callback”。但是看起来默认回调总是空的,因此它总是分配“callback”
上述类在mvcservlet.xml
中引用如下:
<mvc:message-converters>
<bean
class="citygrid.feedmanager.web.converter.MappingJacksonJsonpConverter">
<property name="supportedMediaTypes">
<list>
<value>application/x-javascript</value>
</list>
</property>
</bean>
</mvc:message-converters>
application/x-javascript
正如Alex Ball所建议的,您需要将AJAX请求放入队列中,以便逐个执行它们。它非常简单,如图所示(是的,它也适用于JSON-P)
第二件事是错误消息对象[object Window]的属性“callback”不是函数
只是因为您没有名为callback
的全局函数。只需将其定义为:
window.callback= function(responseText) {
//alert(responseText);
};
希望这能有所帮助。问题在于jQuery如何与JSONP回调一起工作。我的想法是:
jsonpCallback
(默认情况下,jQuery为每个JSONP请求分配唯一的回调),那么一切都可以正常工作。现在,如果您同时发出两个JSONP请求,会发生什么
Callback
的回调Callback
被JSONP2覆盖李>
Callback
为JSONP1触发李>
回调
李>
回调
,但该回调已被删除李>
简单的解决方案是不要覆盖
jsonpCallback
选项。使用同步ajax请求@AlexBall:正如我在问题中提到的,我返回的是不支持同步调用的JSONP数据(跨域调用)。您使用什么来执行AJAX查询?可以粘贴ajax代码吗?如果删除jsonpCallback:'callback'参数会发生什么?所有回调函数都试图使用相同的回调函数名,这就是问题所在吗?使用生成的名称可能会避免这种情况?async:false
不适用于JSONP。而且它与服务器端无关。Chris是对的:问题是所有JSONP请求都有相同的回调。JQuery在JSONP返回后删除回调。这就是为什么如果您快速启动两个JSP,第二个会尝试启动未定义的
回调,导致异常。+1,这是完美的解决方案,IMO和jquery会自动定义一个回调
,并在完成后将其删除。怪诞:非常感谢您的解释。当你说“不要覆盖jsonpCallback选项”时,你到底是什么意思?不是在$.ajax
中定义jsonpCallback:“回调”
?你能解释一下吗?@Bhushan是的,这就是我的意思。@freakish:我试过了,但正如我前面所说,我得到了同样的错误,未捕获的TypeError:对象[object Window]的属性“回调”不是函数
。我还清除了缓存。但是没有运气。知道出了什么问题吗?@Bhushan对不起,我不是Java程序员,我不理解代码的细节。但问题不在于客户端,而在于服务器端。您需要调试它并找出它。或者用Java
标签问另一个问题:-1:这一行:因为您没有名为callback的全局函数,所以它不是true。JQuery足够聪明,可以自动分配名为callback
的回调。
window.callback= function(responseText) {
//alert(responseText);
};