2016-08-19 5 views
3

나는 약속 작업이처럼 사용하는 것을 선호했다 : 파이어 폭스 Promise.defer()이 표준은 나에게 같은 일을주는하지만 난 그냥 건너 온Promise.defer 표준?

function Deferred() { 
    this.resolve = null; 
    this.reject = null; 
    this.promise = new Promise(function(resolve, reject) { 
     this.resolve = resolve; 
     this.reject = reject; 
    }.bind(this)); 
    Object.freeze(this); 
} 

function somethingAsync() { 

    var deferred = new Deferred(); 

    // do stuff then deferred.resolve(); 

    return deferred.promise; 
} 

? 아니면 Firefox에만 해당됩니까? 난 파이어 폭스의 약속 문서에서 찾을 수 없습니다 -

+0

이미 [this] (https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Promise.jsm/Deferred)를 보았습니까? – stevenelberger

+0

고마워요. @stevenelberger 그렇습니다.하지만 그건 사용자가 편집 한 위키입니다. 'Promise.defer'가 파이어 폭스 50으로 존재하기 때문에 나는 그것을 믿지 않는다. – Noitidart

+0

http://www.ecma-international.org/ecma-262/7.0/ ->'ctrl + f' "defer" – zerkms

답변

5

Promise.deferhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise 한 시점에서 제안했지만 그것은 사양에 포함하는 대신 the revealing constructor pattern를 사용하여 약속 생성자를 포함하지하기로 결정했다.

Firefox 및 Chrome에서 구현되었으며 나중에 Chrome에서 제거되었습니다. 그것은 표준이 아니지만 한 지점에서 제안되었습니다.

promise 생성자의 사용법이 명시 적으로 유스 케이스로 지원되었습니다.

위원회가 기본적으로 동기 throw의 시스템을 보호하기 때문에 약속 생성자로했다 가기로 결정 이유는 :

new Promise((resolve, reject) => { 
    thisThrowsSynchronously(); 
}); 

는 약속 생성자는 이런 짓을하지 않았다면 - 당신은 잠재적으로 .catch} catch(e) {에해야 모든 약속은 좌절 할 수있는 함수 호출을 반환합니다. 약속 생성자는 .catch이 충분한 불변 식을 설정합니다.

나는 또한 콜백 API를 변환하지 않는 것을 지적하고자한다. 나는 한 번에 약속 생성자를 사용한 횟수를 셀 수있다. 일반적으로 코드에는 promise 생성자의 지연 또는 사용이 거의 없습니다.

+0

Ben이 멋진 답변을 보내 주셔서 감사합니다. 그러나 jshint는 함수를 동적으로 생성하는 것을 경고합니다 (런타임의 함수 내에서). jshint가 잘못 되었습니까? 그렇게하면 성능에 나쁜 영향을 미치지 않습니다. – Noitidart

+1

'.bind' 이상의 화살표 함수를 사용합니다. 일반적으로 코드는 괜찮지 만, 왜 아무도 연기자를 사용하는 이유를 알지 못합니다. –

+0

어떻게 보이나요? 너무 예뻐요! 'Function Deferred() {this.promise = new Promise ((... args) => [this.resolve, this.reject] = args); return Object.freeze (this)}':). 개인적으로 저는 현재 비동기식 흐름에서 거부 할 이유가 없습니다. 따라서 발생하는 모든 오류는 개발 중에 발견해야합니다. 그러나 이것은 "성능을 위해 동적으로 함수를 생성하지 마십시오"라는 jshint 경고와 함께 현재 프로젝트에서 지연된 것을 사용하게되었습니다. – Noitidart