Как @Bergi говорит JQuery Deferreds/Обещания не расширяемые по прототипному наследованию.
Вместо этого, модель, принятая JQuery, чтобы позволить отдельные случаи Promise быть расширены с помощью синтаксиса:
deferred.promise(target);
//or,
promise.promise(target); //(though the documentation doesn't make this clear)
// where `target` is an "object onto which the promise methods have to be attached"
// see https://api.jquery.com/deferred.promise/
Определяя конструктор с кучей методов, любой Jquery Отложенный или Promise может быть расширен простой синтаксис
.promise(Constructor())
в моей неопубликованной, незарегистрированные JQuery обещает Playground, конструктор называется $P
и хранится в пространстве имен JQuery, следовательно, фактический синтаксис я использую:
.promise($.$P())
Вы должны быть осведомлены о том, что, по большей части, это не нужно вызывать $.$P()
явно как площадка включает в себя $.when_()
метода, который возвращает уже расширенное обещание.
Вот сокращенная версия Playground с достаточно, чтобы обеспечить .delay()
метод:
(function($) {
/* ***********************************
* The $.$P function returns an object
* designed to be extended with
* promise methods using the syntax :
* myDeferred.promise($.$P())
* myPromise.promise($.$P())
* where `myDeferred`/`myPromise`
* are jQuery Deferred/Promise objects.
* ***********************************/
/* ***********************************
* Methods
* ***********************************/
$.$P = function() {
if (this instanceof $.$P) {
return this;
} else {
return new $.$P();
}
};
$.$P.prototype.then_ = function(fa, fb) {
/* A promise method that is the same as .then()
* but makes these extra methods available
* down-chain.
*/
return this.then(fa||null, fb||null).promise($.$P());
}
$.$P.prototype.delay_ = function(ms) {
/* A promise method that
* introduces a down-chain delay.
*/
var promise = this;
function f(method) {
return function() { setTimeout(function(){ method.apply(null,this); }.bind(arguments), ms||0); };
}
return $.Deferred(function(dfrd) {
promise.then(f(dfrd.resolve), f(dfrd.reject));
}).promise($.$P());
}
/* ***********************************
* Utility functions
* ***********************************/
function consolidate(args) {
/* Convert mixed promises/arrays_of_promises to single array.
* Called by all the when_() methods below.
*/
return Array.prototype.slice.apply(args).reduce(function(arr, current) {
return arr.concat(current);
}, []);
}
/* ***********************************
* This section extends the jQuery namespace
* with a "jQuery.when_()" method.
* ***********************************
*/
$.extend({
'when_': function() {
return $.when.apply(null, consolidate(arguments)).promise($.$P()).then_(function() {
return consolidate(arguments);
});
},
});
})(jQuery);
Полная площадка также включает в себя целую кучу более статической и методу Обещания-экземпляр для других целей, и их развития является сутью пьесы.
основного правила использования Playgound заключаются в следующем:
- Все детской площадке статику и обещающие методы заканчиваются в «_» подчеркивание.
- Статические методы, например
$.when_()
, доступны только при установке Playgound.
- Посылы в цепочке обещаний продлеваются путем включения статического метода, например
.when_()
, или цепочки .promise($.$P())
.
- В цепочке обещаний расширения остаются доступными (вниз по цепочке) с использованием методов «..._», а не стандартных методов, например
.then_()
вместо .then()
.
Так вот, как использовать его, чтобы навязать задержки, необходимые для вопроса:
jQuery(function($) {
var MYNAMESPACE = {
run: function (t) {
return $.when_()
.then_(function() {
log("call together");
log("call together");
})
.delay_(t)
.then_(function() {
log("call first");
})
.delay_(t)
.then_(function() {
log("call second");
});
}
}
});
DEMO
В демоверсии, обработчик нажатия этой кнопки дает дополнительную индикацию того, как площадка может быть использован.
на условии использования Экспозиция:
- Как я говорю - это площадка.
- В качестве адаптера для jQuery, а не патча, он ужасно неэффективен в местах. Хуже всего то, что некоторые методы создают промежуточное обещание в дополнение к тому, которое они возвращают.
- Не проверен на стандарты, необходимые для использования в производственном коде, поэтому используйте с осторожностью.
И, наконец, рассмотрите вышеизложенное, если вы решите реализовать задержку с помощью jQuery. Намного гораздо проще использовать обещание lib, которое уже имеет метод .delay()
.
@ guest271314: Мне нужна функция именно обещаний. Эта функция для эффектов. – user348173
Возможный дубликат [Можно ли добавлять методы в объект обещания JQuery?] (Http://stackoverflow.com/q/30719454/1048572) (просто добавьте метод '.delay' вместо' .catch') – Bergi
@ jfriend00: Ну, конечно [возможно] (http://stackoverflow.com/a/30719727/1048572) ... но не так легко, как продлить прототип. – Bergi