Вопрос

Я проводил исследование на предмет обещаний в 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 туземное обещание.Работает и наоборот.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top