Метод ECMAScript Promise.all работает с jQuery.Отложенный.Почему?
-
22-12-2019 - |
Вопрос
Я проводил исследование на предмет обещаний в JavaScript.Мне было интересно, могу ли я объединить обещания ECMAScript с другими реализациями, например jQuery $.Deferred
.И я был удивлен , когда Promises.all
отлично работает с jQuery $.Deferred
.Я пытаюсь найти ответ в исходном коде jQuery и спецификациях CommonJS Promises / A, но я все еще неправильно понимаю, почему этот код работает так, как я ожидал (do console.log
через 10 секунд, а не через 5 секунд):
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
понимать, решено это или нет.Что это за метод / поле?
Решение
Спецификация promises A + (на которой была основана спецификация развертывания promises в зависимости от того, какие собственные promises используются) была специально создана для этого.
С целью проектирования библиотек, хорошо взаимодействующих друг с другом, спецификация построена вокруг одного метода: .then
.
Метод then определяет, как работает продолжение обещания.jQuery обещает разоблачить .then
начиная с версии 1.8, что означает, что они пытаются участвовать в этой игре.В то время как jQuery откладывает выполнение и обещает не Обещания / A + promises - они пытаются быть Обещаниями / A promises, что означает следующее:
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 использует нестандартную реализацию promise, поэтому он не может использовать собственные promises (то есть вы не можете предсказуемо $.when
туземное обещание.Работает и наоборот.