This is a very common question, but I have never found the answer that works properly. I have come across three answers, but none always works.
- $apply: This will force an update, but will randomly through an error if it gets called while a digest is in progress. 
- "safe apply" where there is a check for a digest in progress before calling $apply. This doesn't always update the view for some reason I haven't been able to determine. In addition, there is a small chance that a digest will start between the check and $apply. 
- $timeout: according to the documentation, this should work reliably but doesn't seem to always update the view. 
from $timeout documentation, the parameter invokeApply:
If set to false skips model dirty checking, otherwise will invoke fn within the $apply block. (default: true)
It never throughs an error, but sometimes doesn't update the view during a page load.
Here is a code sample where the problem occurs during page initialization:
EditService.getEvents(Gparams.curPersonID)
.then(function successCallback(response) {
    if (response.status=='200') {
        do some stuff
    } else {
        handle an error
    }   
    var timer = $timeout(function() { }) 
        .then(function successCallback(response) {
            do something
    });                                                                     
    $scope.$on("$destroy", function(event {
     $timeout.cancel(timer)});
});                                                                                     });     
What is the correct answer? Please don't just say what but also discuss why.
 
    