为什么一个Ajax调用做工精细,但连续的Ajax调用失败? [英] Why does a single Ajax call work fine, but consecutive Ajax calls fail?

查看:319
本文介绍了为什么一个Ajax调用做工精细,但连续的Ajax调用失败?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

设置:

我有一个数据表,它的每一行是可以点击的。当行被点击,一个Ajax调用时返回一些数据。有时,Ajax调用需要一点时间,具体取决于正在返回的数据量。这是所有工作的罚款。

问题:

当行快速点击,一前一后出现问题。总之,previous AJAX调用返回之前,如果该行被点击(即一个新的Ajax调用时),我得到一个错误。

 未捕获的类型错误:对象的属性'回调'[对象窗口]不是一个函数
 

(Ajax调用返回JSONP数据)

看起来莫名其妙的Ajax调用越来越混杂(?),但我不知道这一点。谁能告诉我,为什么会发生这种情况?

请让我知道如果任何更多的信息,需要澄清的问题。

感谢

修改1:

下面是一些Ajax code:

  $。阿贾克斯({
                键入:GET,
                网址:HTTP://+ MYSERVER +:8080 / someurl /+ my_param,
                的contentType:应用/ JSON
                数据类型:JSONP
                jsonpCallback:'回调',
                成功:功能(数据){
                //这里里面,我做了一些数据表的东西。
                VAR为myTable = $('#my_table的)。dataTable中({
                        bJQueryUI:真实,
                        bSort:假的,
                        bFilter:假的,
                        bPaginate:真实,
                        bProcessing:真实,
                        bScrollCollapse:真实,
                        bInfo:假的,
                        bDestroy:真实,
                        aaData:样品,
                        sEmptyTable:无样品清单缴费,
                        iDisplayLength:号码,
                        bLengthChange:假的,
                        bAutoWidth:假的,
                        。
                        。
                        。
                    }
 

编辑2:

下面是被分配回调它的名字的类。如果默认的回调为空,那么它分配一个默认值,回调。不过貌似莫名其妙的默认回调总是空,因此它总是分配回调。

 公共类MappingJacksonJsonpConverter扩展MappingJacksonHttpMessageConverter {

    @覆盖
    保护无效writeInternal(Object对象,HttpOutputMessage outputMessage)抛出IOException异常,
            HttpMessageNotWritableException {

        JsonEncoding编码= getJsonEncoding(outputMessage.getHeaders()的getContentType());
        JsonGenerator jsonGenerator = this.getObjectMapper()
                .getJsonFactory()
                .createJsonGenerator(outputMessage.getBody(),编码);
        尝试 {
            字符串jsonPadding =回调;
            如果(对象的instanceof的JSONObject){
                字符串jsonCallback =((JSONObject的)对象).getJsonCallback();
                如果(jsonCallback!= NULL){
                    jsonPadding = jsonCallback;
                }
            }
            jsonGenerator.writeRaw(jsonPadding);
            jsonGenerator.writeRaw(();
            。this.getObjectMapper()writeValue(jsonGenerator,对象);
            jsonGenerator.writeRaw());
            jsonGenerator.flush();
        }赶上(JsonProcessingException前){
            抛出新HttpMessageNotWritableException(无法写入JSON:+ ex.getMessage(),前);
        }
    }
}
 

和上面的类在被引用MVC-servlet.xml中如下:

 < MVC:信息转换器>
        <豆
            类=citygrid.feedmanager.web.converter.MappingJacksonJsonpConverter>
            <属性名=supportedMediaTypes>
                <列表>
                    <价值>应用程序/ x-j​​avascript的< /值GT;
                < /列表>
            < /性>
        < /豆>
    < / MVC:信息转换器>
 

解决方案

现在的问题是在jQuery中如何与回调JSONP。这里的想法:

  1. JS​​ONP被激发;
  2. 在回调设置;
  3. JS​​ONP回报;
  4. 在回调被激发;
  5. 在回调将被删除;

现在一切工作正常,如果你没有定义自定义 jsonpCallback (默认jQuery的分配唯一的回调给每个JSONP请求)。现在会发生什么,如果你做,你火的两个同时JSONP请求?

  1. JS​​ONP1被激发;
  2. 在回调名称回调设置。
  3. JS​​ONP2被激发;
  4. 在回调回调由JSONP2重写;
  5. JS​​ONP1回报;
  6. 在回调回调被解雇JSONP1;
  7. JS​​ONP1删除回调;
  8. JS​​ONP2回报;
  9. JS​​ONP2试图解雇回调,但已经被删除;
  10. 类型错误被抛出。

简单的办法就是不重写 jsonpCallback 选项。

Setup:

I have a Datatable, whose each row is clickable. When a row is clicked, an ajax call is made which returns some data. Sometimes the ajax call takes a little time, depending on the amount of data being returned. It is all working fine.

Problem:

The problem occurs when the rows are clicked quickly, one after the other. In short, before the previous ajax call returns, if the row is clicked (i.e. a new ajax call is made), I get an error.

Uncaught TypeError: Property 'callback' of object [object Window] is not a function 

(The ajax call returns a JSONP data)

It looks like somehow the ajax calls are getting mingled (?), but I am not sure of this. Can anyone please tell me why does this happen?

Please let me know if any more information is required to clarify the issue.

Thanks

EDIT 1:

Here is some ajax code:

            $.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,
                        .
                        .
                        .
                    }

EDIT 2:

Here is the class which is assigning the callback its name. If the default callback is null, then it assigns a default value, "callback". But looks like somehow the default callback is always null and hence it always assigns "callback".

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);
        }
    }
}

And the above class is being referenced in mvc-servlet.xml as follows:

    <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>

解决方案

The problem is in how jQuery works with callback with JSONP. Here's the idea:

  1. JSONP is fired;
  2. Callback is set;
  3. JSONP returns;
  4. Callback is fired;
  5. Callback is deleted;

Now everything works fine if you don't define custom jsonpCallback (by default jQuery assigns unique callback to each JSONP request). Now what happens if you do and you fire two JSONP request at the same time?

  1. JSONP1 is fired;
  2. Callback with name callback is set.
  3. JSONP2 is fired;
  4. Callback callback is overriden by JSONP2;
  5. JSONP1 returns;
  6. Callback callback is fired for JSONP1;
  7. JSONP1 deletes callback;
  8. JSONP2 returns;
  9. JSONP2 tries to fire callback, but that is already deleted;
  10. TypeError is thrown.

Simple solution is not to override jsonpCallback option.

这篇关于为什么一个Ajax调用做工精细,但连续的Ajax调用失败?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆