используя jQuery .promise() для вызова clearInterval()

В последнее время я много экспериментировал с setInterval и clearInterval для создания собственных пользовательских эффектов, и одна из вещей, над которыми я работал, — это эффективный способ очистить интервал, оставаясь вне глобальной области видимости. Я пытаюсь улучшить читаемость и исследовать возможные повышения производительности, используя .promise() для вызова clearInterval() (ниже приведен пример того, что я пытаюсь сделать):

//caller is a collection of elements
function performEffect(caller) {
   var interval = setInterval(function() { caller.next(); }, 500);
   caller.promise().done(function() { interval = clearInterval(interval); });
}

До недавнего времени я устанавливал и очищал интервал с помощью встроенной функции (пример):

function performEffect(caller) {
   var interval;
   var count = 0;
   var len = caller.length;

   if (count >= len) {
       interval = clearInterval(interval);
   }

   var tmr = function () {
       interval = setInterval(function () { effectFunciton(count++); }, 100);
   }
}

P.S. Прошу прощения за то, что не опубликовал оригинал - моя система управления версиями была повреждена. Кроме того, я знаю, что этот пример довольно глупый, так как я мог бы легко использовать цикл for или .each(), но это просто пример - у меня есть случаи, когда я не хочу использовать цикл.

Это мой первый пост, поэтому заранее извиняюсь, если сделаю что-то не так, как принято. Пожалуйста, дайте мне знать, если я могу что-то сделать, чтобы улучшить свои посты в будущем - я всегда открыт для конструктивной критики :)

Спасибо!


person Zachary Kniebel    schedule 06.07.2012    source источник


Ответы (1)


Вы захотите использовать отложенные для этого. Некоторое время назад я написал пример на jsfiddle, который может дать вам некоторое представление.

http://jsfiddle.net/landau/M3Lj4/

Судя по вашему коду, вы неправильно понимаете deferred'ы в целом или здесь недостаточно кода, чтобы понять, что вы делаете. Промисы скрывают resolving и rejecting функциональность

В принципе,

var deferred = $.Deferred();
var promise = deferred.promise();

// This will only run once
var timer = setInterval( function () {
    deferred.resolve();
}, 1000);

promise.done(function () {
    clearInterval( timer );
});
person Trevor    schedule 06.07.2012
comment
Потрясающий! Это именно то, что я искал. Я думаю, что могу немного неправильно понять deferreds, поэтому я проверю больше о них, прежде чем продолжить. Спасибо большое. - person Zachary Kniebel; 06.07.2012
comment
Отлично, если это ответ на ваш вопрос, поставьте галочку. :) - person Trevor; 06.07.2012