2013-01-16 31 views
7

JavaScript in zincirleme yöntemi hakkında daha fazla öğrenmeye çalışıyorum ve zincirdeki bir sonraki işleve yönelik bir jQuery ile bir gecikme oluşturmak için uygun şekilde bilmek istiyorum:Gecikme

var foo = function() { 
    this.delay = function(per) { 
     setTimeout(start, per); 
     return this; 
    }; 
    this.start = function() { 
     alert('start!'); 
    }; 
}; 

var bar = new foo().delay(1000).start(); 
+3

ben alamadım. Bu çok gerçek ve ilginç bir soru. –

cevap

7

Bunu yapmak kolay değil. jQuery bir specific queue system kullanır.

JQuery olmadan yapmak istediğinizi varsayalım, bir kuyruğu kendiniz uygulamanız gerekir. Örneğin

bu çok basit uygulama: Eğer zincirine foo tanımlanmayan başka bir fonksiyon isterseniz

var foo = function() { 
    var queue = []; 
    var timer; 
    this.delay = function(per) { 
     timer = setTimeout(function(){ 
     timer = 0; 
     var f; 
     while (f = queue.shift()) f(); 
     }, per); 
     return this; 
    }; 
    this.addFunction = function(f) { 
     if (timer) queue.push(f); 
     else f(); 
     return this; 
    }; 
    this.start = function() { 
     this.addFunction(function(){alert('start')}); 
     return this; 
    }; 
}; 

Demonstration


, sen

var bar = new foo().delay(3000).start() 
    .addFunction(function(){alert("another chained one")}); 

Demonstration

yapabilir.210
+0

Teşekkürler! o zaman nasıl başka bir yöntem zincirleyebilirim? – user1982408

+0

@ user1982408 Daha yetenekli bir sıra ve isteğe bağlı bir işlevle zincirleme örneği ile düzenledim. Bunun hala basit olduğunu ve jQuery'nin kuyruğunu tüm kullanımlar için değiştirmeyi amaçlamadığını unutmayın;) –

+0

aklıma ilk bakışta beynimden geliyor ama mantığı anlamak için sabırsızlanıyorum - cidden teşekkürler – user1982408

2

Bu çoklu gecikmeler ile zincire size sağlayacaktır: http://jsfiddle.net/z4Uyf/1/

js: Biri kapatmak için neden oy

var foo = function() { 

    var delayed = []; 
    var delayExecution = false; 
    var delayCount = 0; 
    function handleDelay(func){ 
    delayed.push(func); 
    delayCount++; 
    } 

    function delayDone(){ 
    delayExecution = false; 
    if(typeof(delayed[0]) == "function"){ 
     delayed[0](); 
     delayed.splice(0,1); 
    } 
    if(delayed.length > 0) delayExecution = true; 
    } 

    this.delay = function(per) { 
     delayExecution = true; 
     setTimeout(function(){ 
      delayDone(); 
     }, per); 
     return this; 
    }; 

    this.start = function() { 
    if(delayExecution){ 
    handleDelay(arguments.callee); 
    }else{ 
    alert("start!"); 
    } 
    return this; 
    }; 
}; 

var bar = new foo().delay(1000).start().delay(5000).start();