2017-03-05 1 views
0

참고 : AngularJS와 관련된 중복 질문이 How to always run some code when a promise is fulfilled in Angular.js이 아닙니다.자바 스크립트 : 약속이 이행되면 동일한 함수를 호출하십시오.

저는 jQuery의 done이나 AngularJS의 finally과 같은 것을 찾고 있습니다.

나는 해결되거나 거절되는 약속을 가지고 있습니다. 그것이 해결되었거나 거절 되든, 다음과 같이 같은 기능을 수행하고 싶습니다 :

var myPromise = new Promise(function(resolve, reject) { 
    resolve('Success!'); 
    if(something) { 
     resolve('ok'); 
    } else { 
     reject('not ok'); 
    } 
}); 
myPromise.then(function(data) { 
    var x = 1; 
    var y = 2; 
    console.log(data); 
}, function(data) { 
    var x = 1; 
    var y = 2; 
    console.log(data); 
}); 

위의 코드가 작동합니다. 문제는 동일한 함수를 두 번 복사하는 것입니다. 나는이 같은 명명 된 기능을 가질 수 알고

var myPromise = new Promise(function(resolve, reject) { ... }); 
myPromise.then(doWork, doWork); 
function doWork(data) { 
    var x = 1; 
    var y = 2; 
    console.log(data); 
} 

을하지만 방법에 거기 있는지 궁금 해요 :

  • 대신 myPromise.then(doWork, doWork);의, 한 번 함수를 작성하고 ..
  • 을 명명 된 함수 대신 익명의 함수를 사용하십시오. 그리고 ..

답변

5

표준 ES6 약속에서 두 번째 예제와 같이 명명 된 함수를 두 번 사용하십시오. 표준 ES6에는 finally이 없습니다.

Bluebird promise library에는 .finally()이 있습니다.

약속이 거부되는 경우는 그대로 상관하지 않는 경우, 당신은 항상 충족하도록 다음과 같이 이행에 대한 거부를 설정할 수 있습니다 :

myPromise.catch(err => err).then(() => { 
    // put your code here 
}); 

당신은 또한 .finally() 자신을 만들 수 있습니다

if (!Promise.prototype.finally) { 
    Promise.prototype.finally = function(fn) { 
     return this.then(fn, fn); 
    }; 
} 

myPromise.finally(() => { 
    // your code here 
}); 

이것을 사용하면 반환 체인 약속에 대해 fn이 반환하는 값이 적용됩니다. 값을 반환하면 약속은 그 값을 취합니다. 그것이 약속을 되 돌리면, 부모 약속은 그 새로운 약속을 따를 것입니다. 그것이 버리면, 새로운 약속은 거절 될 것입니다.

.finally()의 다른 구현은 항상 원래 부모 약속을 추적하므로 상태가 .finally() 콜백에서 발생하는 영향을받지 않습니다. 여기에 추가 기능을 요구하지 않았으므로 약간 더 복잡한 구현을 보여주지는 않았지만 here in section 14.2과 같은 제안 된 구현을 볼 수 있습니다.

+0

훌륭한 세부 정보! <3 – evilReiko

관련 문제