ECMAScript Promise.all 메서드는 jQuery.Deferred와 함께 작동합니다.왜?
-
22-12-2019 - |
문제
저는 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
기본 약속.다른 방법으로는 작동합니다.