2011-04-24 21 views
1

比方說,我有4個功能,每個功能都與setTimeout()工作內部循環。如何讓這些功能按順序運行並且不重疊?也就是說,我怎樣才能讓他們每一個都在剛剛完成之後執行?如何使用setTimeout()函數按順序工作?

function1(); 
function2(); 
function3(); 
function4(); 

回答

5

讓每個函數在完成後調用下一個函數。

如果您想使其成爲「動態」,請實現一個函數隊列,並讓每個函數在隊列完成時調用隊列中的下一個函數。然後,您可以通過填充隊列並調用第一個函數來啓動順序過程。

1
function function1(cb) { 
    if (someCondition) { 
     setTimeout(function1, 0); 
    } else { 
     // we are done 
     cb(); 
    } 
} 
... 

function1(function() { 
    function2(function() { 
     function3(function() { 
      function4(); 
     }); 
    }); 
}); 

的代碼並開始越來越混亂,如果你去太深所以使用某種類型的流量控制像Step。如果它不是節點,步驟可能不起作用。

一個簡單的隊列可能是:

var queue = { 
    items: [], 
    add: function() { 
     for (var i = 0; i < arguments.length; i++) { 
      this.items.push(arguments[i]); 
     } 
    }, 
    run: function() { 
     var this = that; 
     this.items.shift()(function() { 
      that.run(); 
     }) 
    } 
}; 

queue.add(function1, function2, function3, function4); 

這裏,每個函數應該接受一個函數參數done作爲其第一個參數,當函數做到這一點應該叫。

0

可以傳遞函數數組,

和功能與參數作爲陣列本身。

設置定時器用於下一功能

function fifo(what, delay){ 
    if(what.shift){ 
     var a, f= what.shift() || ''; 
     if(typeof f== 'function') f(); 
     else if(f.constructor== Array){ 
      a= f.splice(1, f.length); 
      f[0].apply(this, a); 
     } 
     if(what.length){ 
      setTimeout(function(){ 
       fifo(what, delay); 
      }, 
      delay); 
     } 

    } 
}; 

function announce(){ 
    return alert(location.href) 
} 
var A= [[alert, 1], [alert, 2], announce, [alert, 'That\'s All!']]; 
fifo(A, 100); 
之前每個人都必須返回