Java 为什么单个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 (

设置:

我有一个Datatable,它的每一行都是可点击的。单击一行时,将进行一个ajax调用,该调用将返回一些数据。有时ajax调用需要一点时间,具体取决于返回的数据量。一切正常

问题:

当一行接一行快速单击时,就会出现问题。简言之,在上一个ajax调用返回之前,如果单击该行(即进行了新的ajax调用),我将得到一个错误

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回调一起工作。我的想法是:

  • JSONP被解雇
  • 设置回调
  • JSONP返回
  • 回调被激发
  • 删除回调 现在,如果不定义自定义
    jsonpCallback
    (默认情况下,jQuery为每个JSONP请求分配唯一的回调),那么一切都可以正常工作。现在,如果您同时发出两个JSONP请求,会发生什么

  • JSONP1被激发
  • 已设置名为
    Callback
    的回调
  • JSONP2被激发
  • 回调
    Callback
    被JSONP2覆盖
  • JSONP1返回
  • 回调
    Callback
    为JSONP1触发
  • JSONP1删除
    回调
  • JSONP2返回
  • JSONP2试图触发
    回调
    ,但该回调已被删除
  • 类型错误被抛出

  • 简单的解决方案是不要覆盖
    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);
    };