Существует время и место для всего. Я видел код со слишком многими шаблонами, которые согласились бы с Вашей точкой зрения, но также и с недостаточным количеством шаблонов, делая код трудным поддержать и подверженный ошибкам при внесении изменений.
Обобщение что-то вроде этого будет логически испорченным, но если Вы перефразируете свой вопрос чему-то вроде, "могут там быть слишком много шаблонов в коде, который является симптоматическим для большей проблемы, то есть, недостаточных уровней абстракции" тогда, ответ был бы да. Это всегда имеет место? Нет.
Вы можете написать это легко:
function wait(delay) {
return {
then: function (callback) {
setTimeout(callback, delay*1000);
}
};
}
wait(3).then(function(){alert("Hello World!");});
Если вы хотите углубиться, я рекомендую вам прочитать о каррировании и приложении частичных функций , эти темы действительно интересны.
Цепочка скорее используется для выполнения нескольких методов для одного объекта. Поэтому лучше рассматривать функцию как объект и устанавливать там тайм-аут:
Function.prototype.callAfter = function(delay) {
setTimeout(this, delay*1000);
};
(function(){alert("Hello World!");}).callAfter(3);
Если вы используете объектно-ориентированный Javascript, то да, вы можете выполнять цепочку методов.
Некоторые популярные JavaScript-фреймворки это делают. jQuery делает это, возвращая объект jQuery для функций, которые обычно не возвращают значение.
Еще одна версия, без закрытия:
function wait(seconds) {
if(this instanceof wait)
this.delay = seconds;
else return new wait(seconds);
}
wait.prototype.then = function(callback) {
setTimeout(callback, this.delay * 1000);
};
С дополнительным кодом вы даже можете многократно вызывать функции:
function wait(seconds) {
if(this instanceof wait)
this.delay = seconds;
else return new wait(seconds);
}
wait.prototype.then = function(callback) {
setTimeout(callback, this.delay * 1000);
return this;
};
wait.prototype.wait = function(seconds) {
this.delay += seconds;
return this;
};
var start = new Date;
function alertTimeDiff() {
alert((new Date - start)/1000);
}
wait(1).then(alertTimeDiff).wait(3).then(alertTimeDiff);