我想一個catch
方法添加到JQuery的promise
對象,這樣我就不必鍵入每次執行以下操作:是否可以向JQuery的承諾對象添加方法?
.then(null,function(data){
// handle error
return $.Deferred().resolve().promise();
});
而且,它會更容易閱讀。我如何在JQuery 1.11中做到這一點?
我想一個catch
方法添加到JQuery的promise
對象,這樣我就不必鍵入每次執行以下操作:是否可以向JQuery的承諾對象添加方法?
.then(null,function(data){
// handle error
return $.Deferred().resolve().promise();
});
而且,它會更容易閱讀。我如何在JQuery 1.11中做到這一點?
是的,這是可能的,但我強烈建議不要這樣做。而是使用合適的承諾庫並吸收你的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));
我被你的短語'合適的承諾庫'所吸引。你會將原生HTML5承諾歸類爲「正確」嗎? http://www.html5rocks.com/en/tutorials/es6/promises/ –
@AndrewShepherd:正確在https://promisesaplus.com/。是的,原生ES6承諾是可以接受的(儘管有很少的功能) – Bergi
@Bergi什麼是'Deferred.when = $ Deferred.when;'? – guest271314
您可以創建自定義然後
$.Deferred().prototype.customthen = function(){
$.Deferred().prototype.then.call(this, null, ,function(data){
// handle error
return $.Deferred().resolve().promise();
})
}
您已經添加了一個名爲customthen原型的新功能。所以,這個新功能在所有情況下都可用。現在
,你可以坦白如下
.customthen();
使用它,我不會使用jQuery「承諾」,因爲在所有他們甚至不遵循規範。例如,使用藍鳥庫。
爲什麼不只是添加一個提供'catch'方法並使用它的合適的promise庫? – Bergi
Btw,'$ .Deferred()。resolve()。promise()'---你不需要最後一個'.promise()'調用 – zerkms