【问题标题】:Is it possible to add methods to JQuery's promise object?是否可以向 JQuery 的 promise 对象添加方法?
【发布时间】:2015-06-19 02:59:29
【问题描述】:

我想向 JQuery 的 promise 对象添加一个 catch 方法,这样我就不必每次都输入以下内容:

.then(null,function(data){
    // handle error
    return $.Deferred().resolve().promise();
});

另外,它会更容易阅读。我将如何在 JQuery 1.11 中执行此操作?

【问题讨论】:

  • 为什么不直接添加一个提供catch 方法的正确promise 库并使用它呢?
  • 顺便说一句,$.Deferred().resolve().promise() --- 你不需要最后一个 .promise() 来电

标签: javascript jquery


【解决方案1】:

是的,这是可能的,但我强烈建议不要这样做。而是使用适当的 Promise 库并同化您的 jQuery Promise;这样您就可以使用内置的库(并且正确).catch() 方法 - 这样您也可以省略 return $.Deferred().resolve().promise(); 行。

扩展 jQuery Promise 的问题在于,它们没有继承我们可以简单修改的​​原型,而是使用工厂模式(阅读 the source)。你需要decorate它:

jQuery.Deferred = (function($Deferred) {
    var Deferred = function(func) {
        var deferred = $Deferred(func),
            promise = deferred.promise();
        deferred.catch = promise.catch = function(fnFail) {
            return promise.then(null, fnFail);
        };
        return deferred;
    };
    return Deferred;
}(jQuery.Deferred));

【讨论】:

  • 我被你的短语“正确的承诺库”所吸引。您会将原生 html5 承诺归类为“正确”吗? html5rocks.com/en/tutorials/es6/promises
  • @AndrewShepherd:与promisesaplus.com 一样。是的,原生 ES6 承诺是可以接受的(虽然功能很少)
  • @Bergi Deferred.when = $Deferred.when; 的目的是什么?
  • @guest271314:很好看。我以某种方式想象$.when 将是$.Deferred.when - 并且需要复制覆盖函数上的所有静态属性以使装饰的函数工作。
  • @Bergi 请参阅github.com/jquery/jquery/blob/… 的第 292、293、297 行?这应该是一个规范的问题/答案吗?问题 “是否可以向 JQuery 的 promise 对象添加方法?” 以前在 SO 中被问过?
【解决方案2】:

坦率地说,我根本不会使用 jQuery “Promises”,因为它们甚至不遵循规范。例如,使用 bluebird 库。

【讨论】:

    【解决方案3】:

    您可以创建您的自定义然后

    $.Deferred().prototype.customthen = function(){
      $.Deferred().prototype.then.call(this, null, ,function(data){
        // handle error
        return $.Deferred().resolve().promise();
      })
    }
    

    您已向原型添加了一个名为 customthen 的新函数。因此,这个新功能在所有情况下都可用。

    现在,你可以如下使用它

    .customthen();
    

    【讨论】:

    • 什么是<Object>?你真的是想扩展原生的Object原型吗?
    • 哪个对象有 then 函数?您的答案将是
    • 问题中已说明。不,jQuery 延迟不使用 .prototype。
    • 这是你要找的对象api.jquery.com/category/deferred-object
    • 所以请在您的答案中填写代码,使其适合问题。
    猜你喜欢
    • 2015-07-29
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    相关资源
    最近更新 更多