[javascript] Angular.js에서 약속이 이행 될 때 항상 일부 코드를 실행하는 방법

내 Angular.js 애플리케이션에서 일부 비동기 작업을 실행하고 있습니다. 시작하기 전에 모달 div로 애플리케이션을 덮은 다음 작업이 완료되면 작업의 성공 여부에 관계없이 div를 제거해야합니다.

현재 나는 이것을 가지고있다 :

LoadingOverlay.start();
Auth.initialize().then(function() {
    LoadingOverlay.stop();
}, function() {
    LoadingOverlay.stop(); // Code needs to be duplicated here
})

잘 작동하지만 다음과 같은 의사 코드와 같은 더 깨끗한 것을 선호합니다.

LoadingOverlay.start();
Auth.initialize().finally(function() { // *pseudo-code* - some function that is always executed on both failure and success.
    LoadingOverlay.stop();
})

나는 그것이 매우 일반적인 문제라고 생각하므로 할 수 있다고 생각했지만 문서에서 아무것도 찾을 수 없습니다. 할 수 있는지 아십니까?



답변

이 기능은 이 풀 리퀘스트 에서 구현되었으며 이제 AngularJS의 일부입니다. 처음에는 “항상”이라고 불렸다가 나중에로 이름이 바뀌 었 finally으므로 코드는 다음과 같아야합니다.

LoadingOverlay.start();
Auth.initialize().then(function() {
    // Success handler
}, function() {
    // Error handler
}).finally(function() {
    // Always execute this on both error and success
});

주 이후 있다는 finally예약 된 키워드가, 그것은 (예 : IE와 안드로이드 브라우저와 같은) 특정 브라우저에 침입하지 않도록하는 문자열 수 있도록해야 할 수도 있습니다 :

$http.get('/foo')['finally'](doSomething);


답변

AngularJS 버전 1.1.5와 함께 Umbraco 버전 7.3.5 백엔드를 사용하고 있으며이 스레드를 찾았습니다. 승인 된 답변을 구현할 때 오류가 발생했습니다.

xxx (…). then (…). finally는 함수가 아닙니다.

그러나 작동 한 것은 always. 이전 버전의 AngularJS를 사용하는 다른 사람이이 스레드를 찾고 finally대신이 코드를 사용할 수없는 경우

LoadingOverlay.start();
Auth.initialize().then(function() {
    // Success handler
}, function() {
    // Error handler
}).always(function() {
    // Always execute this on both error and success
});


답변

angularJS를 사용하지 않는 사람들과 오류를 잡아도 괜찮다면 (.finally ()가 그렇게하는지 확실하지 않은 경우) .catch (). then ()을 사용하여 중복 코드를 피할 수 있습니다.

Promise.resolve()
  .catch(() => {})
  .then(() => console.log('finally'));

catch ()는 결국 로깅이나 기타 정리에 유용 할 수 있습니다.
https://jsfiddle.net/pointzerotwo/k4rb41a7/


답변

ngView를 사용하여 페이지의 콘텐츠를 렌더링하고 $ viewContentLoaded 이벤트에서 모달 제거를 트리거합니다. 해당 이벤트에 대해서는 http://docs.angularjs.org/api/ng.directive:ngView 를 참조 하고 $ on 이벤트 리스너에 대해서는 http://docs.angularjs.org/api/ng . $ rootScope.Scope를 참조하십시오 .


답변