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


83

내 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();
})

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


하나를 연결할 수 있다면 then()반드시 다른 하나 를 연결할 수 있습니다 .initialize().then(...).then(...). 그런 "마지막"은 없습니다. 최종 처리기는 지정된 마지막 처리기입니다.
Beetroot-Beetroot

2
@ Beetroot-Beetroot, 작동하지 않을 것입니다. initialize()실패하면 "성공"함수와 "실패"함수를 모두 선언하고 거기에 코드를 복제해야하기 때문입니다.
laurent 2013-04-17

작동하지 않거나 우아하지 않습니까?
Beetroot-Beetroot

1
Laurent, 원하는 것은 현재 Angular의 경량 $ q 서비스에서 사용할 수 없습니다.이 서비스는 단 하나의 방법으로 약속을 제공합니다 . 여기에서.then() "The Promise API"를 참조하십시오 . 유일한 자유는 하나를 가지 .then()거나 여러 개의를 연결하는 것 .then()입니다. 보다 광범위한 promise API를 원하는 첫 번째 사용자는 아닙니다. 원하는 기능이 여기에서 공식적으로 요청 됩니다 .
Beetroot-Beetroot

1
분명히 always(callback)각도 1.2.6에서 구현되거나 롤백되지 않았습니다. 우리는 finally지금 사용해야 합니다. 예약어 finallyalways.
Aleyna

답변:


164

이 기능은 이 풀 리퀘스트 에서 구현되었으며 이제 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);

10
웹 검색에서 이것을 찾은 사람을 위해 대답의 링크는 함수를 언급 always했지만 finally이 커밋 (또는 소스)에서 볼 수 있듯이 github.com/angular/angular.js/commit/…
Austin Thompson

@AustinThompson, 정보 주셔서 감사합니다. 게시물을 업데이트했습니다.
laurent

@ this.lau_ finally ()는 체인의 마지막 호출이어야합니까, 아니면 더 많은 then ()을 체인으로 연결할 수 있습니까?
Brian

2
당신은 나의 하루를 만들었습니다!
JacobF 2014

4
@Brian finally은 나머지와 마찬가지로 약속을 반환하므로 연결할 수 있습니다. 그러나 편의 과부하 (각도의 일부 버전에 적어도) successerror단지의 즉각적인 반환에 추가됩니다 $http당신이 그렇게하면, 시작finally당신이 그 방법을 잃게됩니다.
drzaus 2015

7

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
});

2

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

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

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.