【问题标题】:ES6 Promise polyfill based on jQuery Deferred基于 jQuery Deferred 的 ES6 Promise polyfill
【发布时间】:2014-08-31 14:03:47
【问题描述】:

我最近下载了一个使用 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。还是有一些无法复制的功能?

【问题讨论】:

  • 我记得有人说 jquery 的 deferred 不能很好地遵守承诺规范,所以使用其他东西可能会更好。
  • 我也听说过,但我似乎记得更多的是关于 jQuery 的函数如何使用承诺,而不是关于一般的 Deferred。但我可能错了。
  • 就我个人而言,我会使用你已经拥有的 polyfill,并保持 jQuery Deferreds/Promises 良好且真正分离,除非你不可避免地不得不将它们混合在一起。
  • @Thomas 可以在不使用 jquery 的情况下撰写作品,包括不同用途的实现; whendonecallback 等。也许创建预期实施的流程图,并带有项目实施目标的文档。使用 js 没有 jquery 的简短文章,其中包括 whendone.then 是原生承诺,可链接 stackoverflow.com/a/23587868 。如果可能,能否描述将提供哪些处理功能?promise,jquery deferred 实现不提供?谢谢

标签: jquery promise jquery-deferred polyfills es6-promise


【解决方案1】:

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

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

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

没有。没有覆盖的部分可以很容易地添加。真正的问题是 jQuery Deferred现有 部分实现 不符合 规范 - 请参阅 Problems inherent to jQuery $.Deferred (jQuery 1.x/2.x)

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

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

【讨论】:

    猜你喜欢
    • 2016-08-04
    • 2016-03-22
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 2015-07-25
    相关资源
    最近更新 更多