Метод JavaScript, объединяющий проблему в цепочку

Существует время и место для всего. Я видел код со слишком многими шаблонами, которые согласились бы с Вашей точкой зрения, но также и с недостаточным количеством шаблонов, делая код трудным поддержать и подверженный ошибкам при внесении изменений.

Обобщение что-то вроде этого будет логически испорченным, но если Вы перефразируете свой вопрос чему-то вроде, "могут там быть слишком много шаблонов в коде, который является симптоматическим для большей проблемы, то есть, недостаточных уровней абстракции" тогда, ответ был бы да. Это всегда имеет место? Нет.

8
задан kizzx2 18 September 2009 в 17:03
поделиться

4 ответа

Вы можете написать это легко:

function wait(delay) {
  return {
    then: function (callback) {
      setTimeout(callback, delay*1000);
    }
  };
}

wait(3).then(function(){alert("Hello World!");});

Если вы хотите углубиться, я рекомендую вам прочитать о каррировании и приложении частичных функций , эти темы действительно интересны.

37
ответ дан 5 December 2019 в 04:32
поделиться

Цепочка скорее используется для выполнения нескольких методов для одного объекта. Поэтому лучше рассматривать функцию как объект и устанавливать там тайм-аут:

Function.prototype.callAfter = function(delay) {
    setTimeout(this, delay*1000);
};

(function(){alert("Hello World!");}).callAfter(3);
2
ответ дан 5 December 2019 в 04:32
поделиться

Если вы используете объектно-ориентированный Javascript, то да, вы можете выполнять цепочку методов.

Некоторые популярные JavaScript-фреймворки это делают. jQuery делает это, возвращая объект jQuery для функций, которые обычно не возвращают значение.

0
ответ дан 5 December 2019 в 04:32
поделиться

Еще одна версия, без закрытия:

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);
14
ответ дан 5 December 2019 в 04:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: