在Angular JS中使用$ timeout而不是window.setTimeout有什么好处?

我有一个build议来实现这样的超时:

$timeout(function() { // Loadind done here - Show message for 3 more seconds. $timeout(function() { $scope.showMessage = false; }, 3000); }, 2000); }; 

有人能告诉我什么是使用这个,而不是使用setTimeout的原因/优势?

在基本的单词$timeout指的是当setTimeout – JavaScript时的angularjs。

如果你仍然想使用setTimeout那么你需要调用$scope.$apply()之后

作为一个方面说明

我build议你阅读我如何“在AngularJS中思考”,如果我有一个jQuery的背景? 岗位

AngularJS:使用$超时,而不是setTimeout

例1:$超时

  $scope.timeInMs = 0; var countUp = function() { $scope.timeInMs+= 500; $timeout(countUp, 500); } $timeout(countUp, 500); 

例2:setTimeout(相同的逻辑)

  $scope.timeInMs_old = 0; var countUp_old = function() { $scope.timeInMs_old+= 500; setTimeout(function () { $scope.$apply(countUp_old); }, 500); } setTimeout(function () { $scope.$apply(countUp_old); }, 500); 

演示小提琴


$超时也返回一个承诺

JS

 function promiseCtrl($scope, $timeout) { $scope.result = $timeout(function({ return "Ready!"; }, 1000); } 

HTML

 <div ng-controller="promiseCtrl"> {{result || "Preparing…"}} </div> 

$超时也触发摘要循环

考虑一下我们有一些3D方面的代码(不是AngularJS),比如Cloudinary插件,它可以上传一些文件,并返回我们进度百分比的callback。

  // ..... .on("cloudinaryprogress", function (e, data) { var name = data.files[0].name; var file_ = $scope.file || {}; file_.progress = Math.round((data.loaded * 100.0) / data.total); $timeout(function(){ $scope.file = file_; }, 0); }) 

我们想要更新我们的UI,也就是$scope.file = file_;

因此, 空的 $timeout为我们做的工作,它会触发摘要周期和3D方更新$scope.file将重新呈现在GUI

  1. 它会自动将你的callback包装在try / catch块中,让我们来处理$ exceptionHandler服务中的错误: http : //docs.angularjs.org/api/ng.$exceptionHandler
  2. 它返回一个承诺,因此倾向于更好地与其他基于承诺的代码进行交互,而不是传统的callback方法。 当您的callback返回时,返回的值用于解决承诺。