当前位置: 首页 > 知识库问答 >
问题:

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

洪弘亮
2023-03-14

设置:

我有一个html" target="_blank">数据表,其每一行都是可点击的。单击行时,将进行 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:

这是为<code>回调</code>分配名称的类。如果默认回调为空,那么它将分配一个默认值“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);
        }
    }
}

上面的类在< code>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个答案

郭思淼
2023-03-14

正如Alex Ball建议的那样,您需要将AJAX请求放入队列中,以便一个接一个地执行它们。这非常简单,如stackoverflow中的一篇帖子所示(是的,它也适用于JSON-P)。

第二件事是错误消息对象[对象窗口]的属性“回调”不是函数只是因为你没有一个名为回调的全局函数。只需像这样定义它:

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

希望这有帮助。

景辰钊
2023-03-14

问题在于jQuery如何使用JSONP进行回调。这个想法是这样的:

  1. JSONP被触发;
  2. 回调设置;
  3. JSONP返回;
  4. 回调被触发;
  5. 回调被删除;

现在,如果您不定义自定义<code>jsonpCallback</code>(默认情况下,jQuery为每个JSONP请求分配唯一的回调),一切都可以正常工作。现在,如果您这样做,并且同时触发两个JSONP请求,会发生什么?

  1. JSONP1被激发
  2. 设置了名称为Callback的回调
  3. JSONP2被激发
  4. 回调<code>回调</code>被JSONP2覆盖
  5. JSONP1返回
  6. 为JSONP1触发回调<code>回调</code>
  7. JSONP1删除<code>回调</code>
  8. JSONP2返回
  9. JSONP2试图触发<code>回调</code>,但已被删除
  10. 引发TypeError

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

 类似资料:
  • 问题内容: 我正在使用开放式天气地图api网络服务进行ajax调用,以便使用纬度和经度获取当前天气,问题是同一调用在我的常规php文件夹中有效,但在我的phongap应用程序中不起作用。我的ajax调用如下所示 我没有尝试将其更改为,但没有任何效果。请帮助我,因为我目前对此仍然感到困惑。 问题答案: 您是否已将config.xml中的网址列入白名单? 了解更多:http : //docs.phon

  • 问题内容: 我正在尝试创建一个书签,单击后将向用户请求一些信息(本例中为url和其他几个字段),然后将该数据发送到服务器上的php页面,然后显示结果。 我想为此进行Ajax调用,以便实际上不重定向到新页面,仅获取数据,但我想我会遇到Ajax的“相同来源策略”限制…。基本上做同一件事的已知方法? 另外,传递参数的最佳方法是什么?我已经有一种机制可以将参数作为表单中的发布消息接收…有什么办法可以重用呢

  • 问题内容: 如果用户查看我的JavaScript文件,复制函数的内容并使用AJAX向我的服务器发送请求,会发生什么情况?有没有办法适当地防止这种情况的发生? 问题答案: 防止这种情况发生的方法与针对 任何 Web请求采取的保护方法没有什么不同。您这样做是为了使您的站点需要某种形式的身份验证(即用户必须登录),并且如果请求未正确身份验证,则不要执行任何操作。 通常,当您发出AJAX请求时,cooki

  • 问题内容: 我想在“ div”中显示txt文件的内容,所以我用按钮调用函数,但是即使我不按按钮,函数也会触发,这是我的HTML代码: 和我的js代码: 问题答案: 的第二个参数应该是一个函数。您没有传递函数,而是立即调用该函数并传递结果。改成:

  • 问题内容: 我有一个网站,我像这样拨打ajax: 所请求的页面除了返回一个数字的状态代码外没有任何作用,并且除IE9之外,在其他所有浏览器上都可以正常运行。该脚本与请求页面托管在同一域中,因此跨域脚本应该没有任何问题。 我终于找到了正在发生的事情,但我不知道如何解决。事实证明,Ajax请求成功完成,没有任何问题。我通过使用Fiddler来查看网络流量来验证了这一点。服务器使用HTTP状态代码200

  • 问题内容: 方案:修改并保存对广告系列的不完整更改 关键是,最后一步中的“错误提示框”是一个ajax调用,它将根据操作成功而带来一个绿色或红色提示框。目前,我要做的是在“然后按保存…”之后,我将进行一次sleep(3),以使其有时间显示此气球。您浪费时间似乎不太明智,也因为在某些时候处理此调用可能花费更多或更少的时间。 你们如何让Behat测试等待Ajax完成,而不仅仅是让野兽入睡? 非常感谢您的