为什么单个Ajax调用工作正常,但连续的Ajax调用失败?

时间:2012-07-16 07:15:19

标签: java ajax jquery jsonp

设定:

我有一个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:

这是分配callback名称的类。如果默认回调为null,则它会分配一个默认值“callback”。但看起来默认回调始终为null,因此它总是指定“回调”。

public class MappingJacksonJsonpConverter extends MappingJacksonHttpMessageConverter {

    @Override
    protected void writeInternal(Object object, HttpOutputMessage outputMessage) throws IOException,
            HttpMessageNotWritableException {

        JsonEncoding encoding = getJsonEncoding(outputMessage.getHeaders().getContentType());
        JsonGenerator jsonGenerator = this.getObjectMapper()
                .getJsonFactory()
                .createJsonGenerator(outputMessage.getBody(), encoding);
        try {
            String jsonPadding = "callback";
            if (object instanceof JsonObject) {
                String jsonCallback = ((JsonObject) object).getJsonCallback();
                if (jsonCallback != null) {
                    jsonPadding = jsonCallback;
                }
            }
            jsonGenerator.writeRaw(jsonPadding);
            jsonGenerator.writeRaw("(");
            this.getObjectMapper().writeValue(jsonGenerator, object);
            jsonGenerator.writeRaw(")");
            jsonGenerator.flush();
        } catch (JsonProcessingException ex) {
            throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex);
        }
    }
}

以上类在mvc-servlet.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>

2 个答案:

答案 0 :(得分:7)

问题在于jQuery如何使用JSONP进行回调。这是个主意:

  1. JSONP被解雇;
  2. 设置了回调;
  3. JSONP返回;
  4. 触发回调;
  5. 删除回调;
  6. 如果你没有定义自定义jsonpCallback,现在一切正常(默认情况下,jQuery为每个JSONP请求分配唯一的回调)。现在如果你这样做会发生什么,你同时发出两个JSONP请求?

    1. JSONP1被解雇;
    2. 设置了名为callback的回调。
    3. JSONP2被解雇;
    4. 回调callback被JSONP2;
    5. 覆盖
    6. JSONP1返回;
    7. 为JSONP1;
    8. 触发回调callback
    9. JSONP1删除callback;
    10. JSONP2返回;
    11. JSONP2尝试触发callback,但已删除;
    12. 抛出TypeError。
    13. 简单的解决方案不是覆盖jsonpCallback选项。

答案 1 :(得分:4)

正如Alex Ball建议您需要将AJAX请求放入队列中,以便逐个执行它们。它显示为here in a post in stackoverflow非常简单(是的,它也适用于JSON-P)。

第二件事是错误消息Property 'callback' of object [object Window] is not a function只是因为你没有名为callback全局函数。只需将其定义为:

window.callback= function(responseText) {
    //alert(responseText);
};

希望这有帮助。