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