【发布时间】:2016-01-30 02:10:36
【问题描述】:
我刚刚遇到了一个奇怪的情况,经过一番搜索后无法找到答案。
我有一个文本框,允许用户输入关键字来过滤表数据。我在输入元素上有一个ng-change 指令,它将触发此代码:
return $http.get(url).then(function (response) {
return response.data;
});
所有这些都运行良好,直到我们的测试人员在 IE11 中发现了一些不良行为。以下是在 IE10 的文本框中输入“M-A-T-T”的示例:
如您所见,每个后续请求都比第一个请求花费更长的时间,因此第四个也是最后一个请求的结果是控制器收到的结果。
这是在 IE11 的文本框中键入“M-A-T-T”的相同示例。
莫名其妙地,第二个请求需要将近 2 秒才能完成,这是在第四个也是最后一个请求完成之后。这会导致在用户期待“MATT”请求的结果(当前在他们的文本框中)时显示“MA”请求的结果。
如何在 Angular 中处理这个问题?提前致谢。
更新 根据frosty 的回复,我实现了以下(除了弹跳)效果很好:
var cancelDeferred;
var getUsers = function (criteria) {
if (cancelDeferred) {
cancelDeferred.resolve();
}
cancelDeferred = $q.defer();
return $http.get(url, { timeout: cancelDeferred.promise }).then(function (response) {
cancelDeferred = undefined;
return response.data;
});
};
实际上,主要的挑战是在调用此方法时处理错误。超时会返回错误,就像 500 会返回错误一样。我想忽略超时并处理实际错误。这是我的解决方案:
function onError(data, status) {
if (data.data !== null && data.status !== 0) {
//handle error
}
}
现在我将尝试找出是否有一种方法可以在全局范围内实现此承诺超时,而不必更改大量 $http.get() 调用...
【问题讨论】:
-
debounce选项可能很有用。看看这里的第二个答案:stackoverflow.com/questions/14722577/…
标签: javascript angularjs angular-http