2013-01-16 16 views
7

मैं जावास्क्रिप्ट में चेनिंग विधि के बारे में अधिक जानने के लिए कोशिश कर रहा हूँ और श्रृंखला में अगले समारोह के लिए कोई jQuery के साथ एक देरी बनाने के लिए उचित तरीके से जानना चाहूंगा:देरी

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

मैं क्यों किसी को बंद करने के लिए मतदान नहीं मिलता है। यह एक बहुत ही वास्तविक और दिलचस्प सवाल है। –

उत्तर

7

यह करना आसान नहीं है। jQuery specific queue system का उपयोग करता है।

मान लीजिए आप jQuery के बिना यह करने के लिए चाहते हैं, आप एक कतार खुद को लागू करने के लिए होगा।

उदाहरण के लिए यह बहुत ही साधारण कार्यान्वयन:

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


आप श्रृंखला को foo में परिभाषित नहीं एक और समारोह चाहते हैं, आप ऐसा कर सकते हैं

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

Demonstration

,210
+0

धन्यवाद! तो मैं इसके लिए एक और तरीका कैसे श्रृंखला सकता है? – user1982408

+0

@ user1982408 मैं एक और अधिक सक्षम कतार और एक मनमाना समारोह के साथ चेन का एक उदाहरण के साथ संपादित। ध्यान दें कि यह अभी भी साधारण है और सभी उपयोगों के लिए jQuery के कतार की जगह का उद्देश्य नहीं है;) –

+0

पहली बार में मेरे दिमाग boggles लेकिन मैं तर्क को समझने के लिए begnning रहा हूँ - गंभीरता से धन्यवाद – user1982408

2

यह कई देरी के साथ श्रृंखला के लिए आप की अनुमति देगा: http://jsfiddle.net/z4Uyf/1/

js:

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(); 
संबंधित मुद्दे