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

Bhu*_*han 8 java ajax jquery jsonp

建立:

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

问题:

快速单击行,一个接一个地出现问题.简而言之,在前一个ajax调用返回之前,如果单击该行(即进行了新的ajax调用),则会出现错误.

Uncaught TypeError: Property 'callback' of object [object Window] is not a function 
Run Code Online (Sandbox Code Playgroud)

(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,
                        .
                        .
                        .
                    }
Run Code Online (Sandbox Code Playgroud)

编辑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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

以上类引用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>
Run Code Online (Sandbox Code Playgroud)

fre*_*ish 7

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

  1. JSONP被解雇了;
  2. 设置回调;
  3. JSONP返回;
  4. 回调被解雇;
  5. 回调被删除;

如果你没有定义自定义,现在一切正常jsonpCallback(默认情况下,jQuery为每个JSONP请求分配唯一的回调).现在如果你这样做会发生什么,你同时发出两个JSONP请求?

  1. JSONP1被解雇了;
  2. callback设置了名称回调.
  3. JSONP2被解雇了;
  4. 回调callback由JSONP2重写;
  5. JSONP1返回;
  6. callback为JSONP1触发回调;
  7. JSONP1删除callback;
  8. JSONP2返回;
  9. JSONP2尝试触发callback,但已经删除;
  10. 抛出TypeError.

简单的解决方案不是覆盖jsonpCallback选项.