【发布时间】: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