4

我最近下载了一个使用 ES6 Promises 的库。由于我想部署到不支持 Promises 的浏览器,我还下载了一个polyfill

因为无论如何我都包含了 jQuery,所以我考虑为 Promise 编写一个 polyfill,它在内部使用 jQuery 的 Deferred。

我编写了这个简单的 polyfill,足以满足我的特定用例:

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

        cb(promise.resolve, promise.reject);

        return promise.promise();
    };

问题在于它没有涵盖整个规范(认为Promise.all()缺少)。

在我投入大量时间之前,我想知道是否可以使用 jQuery 的 Deferred 为 Promise 编写完整的 polyfill。还是有一些无法复制的功能?

4

1 回答 1

3

之类的东西Promise.all()不见了

Promise.all可以通过使用$.when或多或少地复制。Promise.race可以通过创建一个 deferred 来复制其resolve/reject方法附加到所有输入承诺。

问题在于它没有涵盖整个规范

不会。未涵盖的部分可以轻松添加。真正的问题是jQuery实现的现有部分不符合规范 - 请参阅jQuery $.Deferred (jQuery 1.x/2.x) 固有的问题Deferred

在我投入大量时间之前,我想知道是否可以使用 jQuery 的 Deferred 为 Promise 编写完整的 polyfill。还是有一些无法复制的功能?

一切都可以复制,但是您需要在Deferred实现中进行足够的猴子补丁,以便您最好只使用现有的 polyfill 之一。如果你真的想创建自己的,你可能会基于一个jQuery.Callbacks("once memory").

于 2014-08-31T14:47:51.643 回答