Solution to “Error: $digest already in progress” in AngularJS
AngularJS is a popular framework that has obtained significant traction in providing rich web applications. Although AngularJS provides many performance enhancements built in, it leads developers run into many common problems when coding is done improperly. Therefore, in this article, we’ll look at some performance pointers that you can use in your AngularJs applications that will help you to build error free applications.
Let’s now look at the highlighted error ” $digest already in progress”. Generally while working on an AngularJS code in a web page, it is common practise to update and modify the scope when changing something of it from a directive or a controller. Sometimes the updated changes may not be reflected on the front-end in the manner which you expect and intern you’ll get an error thrown from Angular saying ” $digest already in progress” as soon as the dialog was loaded.
Let’s walk through with some underlying easy performance considerations for Angular that help us bring down this error and understand the $digest cycle a bit better. In the process of loading the program, Angular runs the event loop called a $digest cycle. When we create data-bindings with AngularJS, we’re creating more $$watchers and $scope Objects, which in turn will take longer to process on $digest. The drawback here is that this updating process takes some time to be done . To side step this problem, we can invoke the digest cycle of AngularJS implicitly by using $scope.$apply() with the $timeout() function. This let’s Angular update itself with new values and will implicitly calls $apply() after a delay. When $scope.$apply() is called, it boosts the entire application into the $digest loop and in turn runs $rootScope.$digest(). This cycle processes all of the watchers of the $scope it was called from.
Apart from this you have other option to resolve this type of issue by placing it in logic that explicitly checks the AngularJS $$phase. Here’s some code example usage to demonstrate the concept:
//$digest or $apply
This $scope.$$phase will return “$digest” or “$apply” if a $digest or $apply is in progress. Hope this article might help AngularJS developers with a common pitfall. In AngularJS all the small errors we encounter have much simpler and elegant solutions. Try to understand the scope and use the best practices mentioned above when you write AngularJs apps code. In short, invoking the digest cycle of AngularJS implicitly by using $scope.$apply() will perform all expressions in templates and watchers.