내 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를 참조하십시오 .