I had a suggestion to implement a timeout like this:
$timeout(function() { // Loadind done here - Show message for 3 more seconds. $timeout(function() { $scope.showMessage = false; }, 3000); }, 2000); };
Can someone tell me what is the reason / advantage in using this rather than using setTimeout?
setTimeout in order to display an alert message after a timeout of at least 2000 milliseconds. Angular $timeout is a wrapper written for window. setTimeout in form of a try catch block which throws exceptions via $exceptionHandler service. $timeout accepts the function to be delayed, delay time, a boolean to invoke $.
This '$timeout' service of AngularJS is functionally similar to the 'window. setTimeout' object of vanilla JavaScript. This service allows the developer to set some time delay before the execution of the function.
The $timeout service can be used to call another JavaScript function after a given time delay. The $timeout service only schedules a single call to the function. For repeated calling of a function, see $interval later in this text.
The setInterval method has the same syntax as setTimeout : let timerId = setInterval(func|code, [delay], [arg1], [arg2], ...) All arguments have the same meaning. But unlike setTimeout it runs the function not only once, but regularly after the given interval of time.
In basic words $timeout
refers to angularjs when setTimeout
- to JavaScript.
If you still think to use setTimeout
therefore you need invoke $scope.$apply()
after
As a side note
I suggest you to read How do I “think in AngularJS” if I have a jQuery background? post
and AngularJS: use $timeout, not setTimeout
$scope.timeInMs = 0; var countUp = function() { $scope.timeInMs+= 500; $timeout(countUp, 500); } $timeout(countUp, 500);
$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);
Demo Fiddle
JS
function promiseCtrl($scope, $timeout) { $scope.result = $timeout(function({ return "Ready!"; }, 1000); }
HTML
<div ng-controller="promiseCtrl"> {{result || "Preparing…"}} </div>
Consider we have some 3d party code (not AngularJS) like Cloudinary plugin that uploads some file and returns us 'progress' percentage rate 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); })
We want to update our UI aka $scope.file = file_;
So empty $timeout
does the job for us, it will trigger digest cycle and $scope.file
updated by 3d party will be re-rendered in GUI
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With