Promise.done(),Promise.finally()

2242 단어
es6 Promise.done(),Promise.finally () promise 대상의finally 함수를 왜 이렇게 쓰는지ES6Promise API는 제공하는 방법이 많지 않고 일부 유용한 방법은 스스로 배치할 수 있다.다음은 두 가지 부재ES6에 배치하지만 유용한 방법을 소개한다.

done()

Promise 대상의 리셋 체인은 then 방법이나 catch 방법으로 끝나든 마지막 방법이 오류를 던지면 포착되지 않을 수 있다Promise 내부의 오류가 전체 국면에 퍼지지 않기 때문이다).따라서 우리는 done 방법을 제공하여 항상 리셋 체인의 끝에 위치하고 발생할 수 있는 모든 오류를 제거할 수 있다.
  Promise.prototype.done = function (onFulfilled, onRejected) {
    this
      .then(onFulfilled, onRejected)
      .catch(function (reason) {
        //  
        setTimeout(() => {
          throw reason
        }, 0)
      })
  }

위 코드에서 볼 수 있듯이 done 방법의 사용은 then 방법처럼 사용할 수 있고 fulfilledrejected 상태의 리셋 함수를 제공할 수 있으며 어떠한 매개 변수도 제공하지 않을 수 있다.그러나 어쨌든 done는 발생할 수 있는 모든 오류를 포착하고 전체 국면에 던질 것이다.

finally()

finally 방법은 Promise 대상의 마지막 상태가 어떻든지 간에 실행할 동작을 지정하는 데 사용된다.이것은 done 방법과 가장 큰 차이점이다. 일반적인 리셋 함수를 매개 변수로 받아들이고, 이 함수는 어쨌든 실행해야 한다.
다음은 서버가 Promise로 요청을 처리한 다음finally 방법으로 서버를 끄는 예입니다.
  Promise.prototype.finally = function (callback) {
    let P = this.constructor
    return this.then(
      value => P.resolve(callback()).then(() => value),
      reason => P.resolve(callback()).then(() => {
        throw reason
      })
    )
  }

위 코드에서 앞의 Promisefulfilledrejected든 모두 리셋 함수callback를 실행한다.
이것은 ES5로 전환한 후의 것이다.
  Promise.prototype.finally = function (callback) {
    var P = this.constructor
    return this.then(function (value) {
      return P.resolve(callback()).then(function () {
        return value
      })
    }, function (reason) {
      return P.resolve(callback()).then(function () {
        throw reason
      })
    })
  }

이렇게 쓰는 이유는 finally가 이 promise 체인의 마지막 고리가 아니라 상대적으로 done야말로.finally 이후에 thencatch 등이 있을 수 있기 때문에 promise 대상을 되돌려야 한다.

좋은 웹페이지 즐겨찾기