$applyAsync already exists:
Schedule the invocation of $apply to occur at a later time. The actual time difference varies across browsers, but is typically around ~10 milliseconds.
This can be used to queue up multiple expressions which need to be evaluated in the same digest
evalAsync handles digests differently:
$evalAsync triggers a digest, and is unsuitable when it is expected that a
digest should not occur.
Note: if this function is called outside of a $digest cycle, a new $digest cycle will be scheduled.
This behavior of this when called implicitly changed in AngularJS 1.3:
-Previously, even if invokeApply was set to false, a $rootScope digest would occur during promise resolution.
This is no longer the case, as promises returned from $timeout and $interval will no longer trigger $evalAsync
(which in turn causes a $digest) if invokeApply is false.
Workarounds include manually triggering $scope.$apply(), or returning $q.defer().promise from a promise callback, and resolving or rejecting it when appropriate.
References