2015-06-08 67 views
0

我想一個catch方法添加到JQuery的promise對象,這樣我就不必鍵入每次執行以下操作:是否可以向JQuery的承諾對象添加方法?

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

而且,它會更容易閱讀。我如何在JQuery 1.11中做到這一點?

+2

爲什麼不只是添加一個提供'catch'方法並使用它的合適的promise庫? – Bergi

+0

Btw,'$ .Deferred()。resolve()。promise()'---你不需要最後一個'.promise()'調用 – zerkms

回答

4

是的,這是可能的,但我強烈建議不要這樣做。而是使用合適的承諾庫並吸收你的jQuery承諾;以便您可以使用內置庫(並更正).catch()方法 - 以便您也可以省略該行。

擴展jQuery承諾的問題在於,它們不能從我們可以簡單修改的​​原型繼承,而是使用工廠模式(請參閱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)); 
+0

我被你的短語'合適的承諾庫'所吸引。你會將原生HTML5承諾歸類爲「正確」嗎? http://www.html5rocks.com/en/tutorials/es6/promises/ –

+0

@AndrewShepherd:正確在https://promisesaplus.com/。是的,原生ES6承諾是可以接受的(儘管有很少的功能) – Bergi

+1

@Bergi什麼是'Deferred.when = $ Deferred.when;'? – guest271314

-1

您可以創建自定義然後

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

您已經添加了一個名爲customthen原型的新功能。所以,這個新功能在所有情況下都可用。現在

,你可以坦白如下

.customthen(); 
+0

什麼是''?你真的想要擴展原生的'Object'原型嗎? – Bergi

+0

哪個對象具有**然後**?你的回答將是

+0

這是在問題中陳述。不,jQuery延遲不使用'.prototype'。 – Bergi

0

使用它,我不會使用jQuery「承諾」,因爲在所有他們甚至不遵循規範。例如,使用藍鳥庫。

相關問題