仅当用户在页面上停留超过一秒时,如何检索数据

时间:2014-07-18 14:39:13

标签: javascript jquery angularjs

在AngularJS应用中,用户可以浏览多个页面。 每次显示页面时,控制器都会提取服务器以检索某些数据。

我想在启动请求之前等待1秒钟,因此如果用户快速离开该页面以获取其他视图,我们就不会加载数据。

我尝试使用$ timeout但是即使已经加载了其他视图和其他控制器,也会执行查询。

app.controller('showController', function($scope, $routeParams, $timeout){
  $timeout(function(){
    Service.getDataDetails(id).then(function (result) {
      $scope.data = result;
    });
  },1000);
});

我也尝试取消查询。该查询在导航器中被取消,但服务器仍然执行它。

5 个答案:

答案 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}}块中的代码。