ES6 Promise polyfill на основе jQuery Deferred

Недавно я скачал библиотеку, использующую обещания ES6. Поскольку я хочу выполнить развертывание в браузерах, которые не поддерживают промисы, я также загрузил polyfill.

Поскольку у меня в любом случае есть jQuery, я подумал о написании полифилла для Promise, который внутренне использует Deferred jQuery.

Я написал этот простой полифилл, которого достаточно для моего конкретного случая использования:

    window.Promise = function(cb){
        var promise = $.Deferred();

        cb(promise.resolve, promise.reject);

        return promise.promise();
    };

Проблема с этим в том, что он не охватывает всю спецификацию (думает, что Promise.all() отсутствует).

Прежде чем я потрачу много времени на это, я хотел бы знать, возможно ли написать полный полифилл для Promise, используя Deferred jQuery. Или есть некоторые функции, которые нельзя воспроизвести?


person Thomas    schedule 31.08.2014    source источник
comment
Я помню, как кто-то сказал, что jquery deferred не очень хорошо соответствует спецификациям промисов, поэтому может быть лучше использовать что-то другое.   -  person simonzack    schedule 31.08.2014
comment
Я тоже это слышал, но, кажется, я помню, что это было больше о том, как функции jQuery используют промисы, а не об отложенных в целом. Но я могу ошибаться.   -  person Thomas    schedule 31.08.2014
comment
Лично я бы использовал полифилл, который у вас уже есть, и хорошо и по-настоящему разделил jQuery Deferreds/Promises, если только вы не неизбежно загнали их в угол.   -  person Roamer-1888    schedule 31.08.2014
comment
@Thomas Можно было бы написать произведение без использования jquery, включая реализацию для различных целей; when, done, callback и т. д. Возможно составить блок-схему предполагаемой реализации с документированием целей реализации проекта. Краткий фрагмент, использующий js без jquery, который включает when и done; .then — это собственное обещание, поддерживающее цепочку stackoverflow.com/a/23587868. Если возможно, можете описать, какие функции обработки будут предоставлены? Что promise, реализация jquery deferred не обеспечивает? Спасибо   -  person guest271314    schedule 02.09.2014


Ответы (1)


такие вещи, как Promise.all(), отсутствуют

Promise.all можно более или менее воспроизвести с помощью используя $.when. Promise.race можно воспроизвести, создав deferred, чьи методы resolve/reject привязаны ко всем входным промисам.

Проблема в том, что он не охватывает всю спецификацию.

Нет. Части, которые не покрыты, могут быть легко добавлены. Настоящая проблема заключается в том, что существующие части реализации jQuery Deferred не соответствуют спецификации - см. Проблемы, присущие jQuery $.Deferred (jQuery 1.x/2.x)

Прежде чем я потрачу много времени на это, я хотел бы знать, возможно ли написать полный полифилл для Promise, используя Deferred jQuery. Или есть некоторые функции, которые нельзя воспроизвести?

Все может быть реплицировано, но вам потребуется достаточно обезьяньих патчей в реализации Deferred, чтобы лучше просто использовать один из существующих полифиллов. Если вы действительно хотите создать свой собственный, вы можете создать его на основе jQuery.Callbacks("once memory").

person Bergi    schedule 31.08.2014