在AngularJS应用中,用户可以浏览多个页面。 每次显示页面时,控制器都会提取服务器以检索某些数据。
我想在启动请求之前等待1秒钟,因此如果用户快速离开该页面以获取其他视图,我们就不会加载数据。
我尝试使用$ timeout但是即使已经加载了其他视图和其他控制器,也会执行查询。
app.controller('showController', function($scope, $routeParams, $timeout){
$timeout(function(){
Service.getDataDetails(id).then(function (result) {
$scope.data = result;
});
},1000);
});
我也尝试取消查询。该查询在导航器中被取消,但服务器仍然执行它。
答案 0 :(得分:2)
$ timeout服务有一个cancel method来取消超时
var promise = $timeout(function(){
Service.getDataDetails(id).then(function (result) {
$scope.data = result;
});
},1000);
//...
//somewhere else
$timeout.cancel(promise);
取消方法会导致承诺被拒绝而不是解决。
答案 1 :(得分:2)
取消控制器析构函数中的$timeout
:
$scope.$on("$destroy", function handler() {
$timeout.cancel(promise);
});
当控制器不再使用时调用它。
Patrick Evens提醒我告诉你promise变量的来源:
var promise = $timeout(function(){
Service.getDataDetails(id).then(function (result) {
$scope.data = result;
});
},1000);
答案 2 :(得分:0)
当您发出请求时,控制权将转到服务器,然后作为响应,您只能获得一个视图。因此,在文档就绪中您可以有超时,这不会阻止服务器调用。为了防止服务器调用,您需要在控制器中编写代码以在发送响应之前等待1秒。 我希望这可能会清楚。
答案 3 :(得分:0)
如果没有向服务器发出呼叫,取消超时应该有效。
var timer = $timeout(function(){
Service.getDataDetails(id).then(function (result) {
$scope.data = result;
});
},1000);
并取消超时,如下所示:
$timeout.cancel(timer);
答案 4 :(得分:0)
通过将$timeout
ID分配给变量,获取var timeoutID = $timeout(...
ID:$timeout
。
在$timeout.cancel( timeoutID )
块之前,在同一范围内,使用$timeout
清除超时。这可确保在用户导航到1000毫秒内的新页面时,不会执行{{1}}块中的代码。