티스토리 뷰

 

$digest already in progress

  • angularJS에서 발생하는 오류, 이 오류는 $digest 루프가 이미 진행 중일 때 또 다른 $digest 루프가 시작되려고 할 때 발생하는 오류이다.

$digest

  • angularjs 데이터 바인딩 시스템에서 모델이 변경될 때 이를 ui에 반영하기 위해 실행되는 프로세스

문제 원인

  1. 모델이 변경될 때 $digest 루프를 시작하여 뷰를 업데이트하는데 이 루프가 완료 되기 전에 또 다른 모델 변경이 발생하면 $digest already in progress 오류가 발생한다.
  2. $digest 또는 $apply를 수동으로 호출할 때 이 오류가 발생한다. 예를 들어 한 $digest가 진행 중일 때 또 다른 $digest나 $apply를 호출하면 충돌이 일어날 수 있다.

 

해결 방법

  1. setTimeout($timeout) 사용하기 setTimeout은 $digest 루프가 완료된 후에 코드가 실행되도록 보장한다.
setTimeout(() => {
	$scope.apply(() => {
    	// 모델 변경
    });
});
  1. $scope.$applyAsynce 사용하기 $applyAsync는 $digest 루프가 끝난 후에 처리를 예약해 오류를 방지한다.
$scope.applyAsync(() => {
	// 모델 변경
});

 

angularJS에서 모델 변경을 처리할 때는 $digest가 진행 중인지 확인하고, 그에 맞게 적절한 방법을 선택해야한다.