是否可以向JQuery的promise对象添加方法?

时间:2015-06-08 21:30:48

标签: javascript jquery

我想在JQuery的catch对象中添加promise方法,所以我不必每次都输入以下内容:

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

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

3 个答案:

答案 0 :(得分:4)

是的,有可能,但我强烈建议不要这样做。而是使用适当的promise库并吸收你的jQuery承诺;这样你就可以使用库内置(和正确).catch()方法 - 这样你就可以省略return $.Deferred().resolve().promise();行。

扩展jQuery承诺的问题在于它们不会继承我们可以简单修改的​​原型,而是使用工厂模式(read 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));

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

您可以创建自定义然后

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

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

现在,您可以按如下方式使用它

.customthen();