문제

저는 JavaScript의 Promise에 대한 연구를 하고 있었습니다.ECMAScript Promises를 jQuery와 같은 다른 구현과 결합할 수 있는지 궁금합니다. $.Deferred.그리고 나는 놀랐다. Promises.all jQuery와 잘 작동 $.Deferred.jQuery 소스 코드와 CommonJS Promises/A 사양에서 답을 찾으려고 노력하고 있지만 이 코드가 예상대로 작동하는 이유를 여전히 오해했습니다(do console.log 5초가 아닌 10초 후):

var promise = new Promise(function (resolve, reject) {
    setTimeout(function () { 
        resolve();//resolve first promise after 5 secs
        console.log('Promise resolved');
    }, 5000);
});

var deferred = $.Deferred();
setTimeout(function () { 
    deferred.resolve();//resolve after 10 seconds
    console.log('Deferred resolved');
}, 10000);

Promise.all([promise,deferred]).then(function () {
    console.log('All is done');//log after 10 seconds
});

어떤 아이디어가 있나요?

Promise.all 어떤 분야나 방법에 의존해야 합니다. $.Deferred 이해하는 것이 해결되었는지 여부입니다.그 방법/분야는 무엇입니까?

도움이 되었습니까?

해결책

Promise A+ 사양(Promise unwrapping 사양은 기본 Promise 사용을 기반으로 함)은 이를 위해 특별히 구축되었습니다.

라이브러리 상호 운용이 원활하다는 설계 목표를 바탕으로 사양은 단일 방법을 중심으로 구축되었습니다. .then.

then 메소드는 Promise의 연속이 어떻게 작동하는지 지정합니다.jQuery 약속은 노출됩니다 .then 버전 1.8부터 이는 그들이 이 게임에 참여하려고 한다는 것을 의미합니다.jQuery 연기 및 약속은 ~ 아니다 Promises/A+ 약속 - 다음을 의미하는 Promises/A 약속이 되려고 시도합니다.

return Promise.resolve($.get(...))

항상 작동합니다.A+ 약속(및 기본 약속)은 모든 것을 동화합니다. .then재귀적으로 사용할 수 있으며 반환할 때 해당 값으로 해결할 수 있습니다.

Promise.resolve({then:function(fn){ return fn(3); }}).then(function(el){
    console.log(el); // this logs 3
})

우리가 확인하면 사양 , 우리는 볼 수있다:

허락하다 결과 호출(다음 약속, "then", (해결요소, 약속능력.[[거부하다]])).

(또한 관련된 것은 이것)

어느 전화 .then 그러면 다음 항목을 해결합니다. .then유능한 결심

jQuery의 deferred는 비표준 약속 구현을 사용하므로 기본 약속을 사용할 수 없습니다. $.when 기본 약속.다른 방법으로는 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top