【问题标题】:JQuery: multiple JSON requests with deferred/promise failedJQuery:延迟/承诺的多个 JSON 请求失败
【发布时间】:2013-12-02 11:40:23
【问题描述】:

我们有一个应用程序允许用户通过 Ajax 请求加载数据。比如说,我们有一个名为“曲目”的项目列表。每当用户单击曲目时,我们都会发出 Ajax 请求,获取数据并显示。每个轨道都包装为一个 JQuery 小部件。发出请求并处理结果的代码是:

function _fullRefresh() {
    // Prepare parameters ...
    return $.Deferred(function(def) {
        $.getJSON(url, params, function(data) {
            callFunctionRunforLongTime(data);
                    // update some local variables.
            def.resolve();
        }).error(function() {
            def.reject();
        });
    }).promise();
}

......
loadingIcon.show();
this._fullRefresh(forced)
    .always(function() {
        loadingIcon.hide();
    }).fail(function() {
        showError();
    });

当我们有多个打开的轨道时会出现问题。有时用户单击“放大”按钮,然后每个打开的轨道都会发送一个新请求并更新数据。现在有线的事情发生了:有时promise对象是rejected(所以显示错误消息),但是从后端服务器端,HTTP响应代码是200,这意味着后端发送数据没有错误。

当用户点击太快时,错误并不总是发生。当用户单击按钮一次时,可能会发生这种情况。

同时,更新本地小部件变量的代码有时会失败。在我的实现中,更新本地小部件变量的代码大约为 10 行。

是什么原因?请帮忙,谢谢。


已解决。

感谢@charlietfl 和@Beetroot-Beetroot。我发现问题不是由javascript引起的。这是因为对 MySQL 的同时查询导致连接失败。

【问题讨论】:

  • callFunctionRunforLongTime(data) 做异步操作吗?
  • $.getJSON 返回一个修饰的延迟对象。你可以直接调用promise() 来返回一个承诺:return $.getJSON(url, params, callFunctionRunforLongTime).promise()。无需自己手动构造一个新的deferred
  • @charlietfl No. callFunctionRunforLongTime(data) 使用 Ajax 数据和 cookie 数据绘制画布。
  • 请记住,200 状态并不意味着您有响应数据,或者数据格式符合预期...您是否在控制台的网络选项卡中检查了请求,并查看了实际响应正文?例如,如果服务器在您期望 json 时输出 html 错误消息
  • 问题中的代码看起来不错,尽管它可以写得更简单(参见 Joseph Silber 的评论)。错误必须在附加事件处理程序的代码和/或$.getJSON() 和/或callFunctionRunforLongTime() 返回的数据中。

标签: jquery ajax json jquery-deferred


【解决方案1】:

感谢@charlietfl 和@Beetroot-Beetroot。我发现问题不是由javascript引起的。这是因为对 MySQL 的同时查询使连接失败。

【讨论】:

    猜你喜欢
    • 2015-03-27
    • 2023-03-21
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多