2011-02-10 133 views
5

我有大量的函數需要連續運行,但不是在另一個完成之前。我需要的是一種排隊這些函數的方法,只有在前一個函數成功完成後才能運行。有任何想法嗎?JavaScript函數隊列

Function1(); 
Function2(); 
Function3(); 
Function4(); 
Function5(); 
+0

你的代碼應該只是罰款...(如果「成功地完成了」你的意思是,函數返回) – 2011-02-10 02:30:15

+1

有異步的東西在你的功能呢?如果沒有,我看不到問題。 – spender 2011-02-10 02:31:18

+0

我的大部分函數都包含AJAX調用。每一個都取決於上次調用的成功。 – user610728 2011-02-10 02:32:33

回答

0

爲什麼不按照您所示的方式完成,只要將它們列入覆蓋函數?

function do_1_to_5() { 
    Function1(); 
    Function2(); 
    Function3(); 
    Function4(); 
    Function5(); 
} 

如果您的函數包含AJAX調用,那麼您需要在處理AJAX調用的回調函數的末尾掛接它們。

0

,以確保他們連續運行,則可能會返回從每一個和使用,在隨後的一個返回值的值...

function do_1_to_5() { 

    r1 = Function1(); 
    r2 = Function2(r1); 
    r3 = Function3(r2); 
    r4 = Function4(r3); 
    r5 = Function5(r4); 

} 
7

你可以使用這樣的事情:

var FunctionQueue = (function(){ 
    var queue = []; 
    var add = function(fnc){ 
     queue.push(fnc); 
    }; 
    var goNext = function(){ 
     var fnc = queue.shift(); 
     fnc(); 
    }; 
    return { 
     add:add, 
     goNext:goNext 
    }; 
}()); 

,並使用它是這樣的:幾年後

var fnc1 = function(){ 
    window.setTimeout(function(){ 
     alert("1 done"); 
     FunctionQueue.goNext(); 
    }, 1000); 
}; 

var fnc2 = function(){ 
    window.setTimeout(function(){ 
     alert("2 done"); 
     FunctionQueue.goNext(); 
    }, 5000); 
}; 

var fnc3 = function(){ 
    window.setTimeout(function(){ 
     alert("3 done"); 
     FunctionQueue.goNext(); 
    }, 2000); 
}; 

FunctionQueue.add(fnc1); 
FunctionQueue.add(fnc2); 
FunctionQueue.add(fnc3); 
FunctionQueue.goNext(); 

編輯: 另一種方法是人們正在接近這個傳遞函數,您可以調用next繼續鏈。像這樣:

var Queue = function(arr){ 
    var index = 0; 
    var next = function(){ 
     if (index >= arr.length) {return;} 
     arr[index++](next); 
    }; 
    return next; 
}; 

var fn1 = function(next){ 
    console.log("I am FN1"); 
    next(); 
}; 

var fn2 = function(next){ 
    console.log("I am FN2"); 
    setTimeout(next,1000); 
}; 

var fn3 = function(next){ 
    console.log("I am FN3"); 
    setTimeout(next,3000); 
}; 

var fn4 = function(next){ 
    console.log("I am FN4"); 
    setTimeout(next,1000); 
}; 

Queue([fn1, fn2, fn3, fn4])(); 
5

您可以創建一個隊列功能:

function Queue(arr) { 
    var i = 0; 
    this.callNext = function() { 
     typeof arr[i] == 'function' && arr[i++](); 
    }; 
} 

所以,如果這些是你的職責......

function f1() { 
    alert(1); 
} 

function f2() { 
    alert(2); 
} 

function f3() { 
    alert(3); 
} 

...你只是通過他們(它們的引用)在新的隊列實例中:

var queue = new Queue([f1, f2, f3]); 

然後你執行callNext()調用函數順序:

queue.callNext(); 
queue.callNext(); 
queue.callNext(); 

現場演示:http://jsfiddle.net/CEdPS/3/

0

你並不需要所有的機器,只要把你的函數在數組中。然後你可以循環它們。

var runThese = [ 
    Function1, 
    Function2, 
    Function3, 
    Function4, 
    Function5 
]; 

JavaScript是單線程的,因此您可以保證在下一次啓動前完成。

for (var i = 0; i < runThese.length; i++) { 
    runThese[i](); 
} 

或者因爲你的函數具有確定性的名稱,你可以完全避免的數組:

for (var i = 1; i <= 5; i++) { 
    window["Function" + String(i)](); 
} 
0

退房async.js - 它提供了一種機制鏈接起來的功能,使他們異步或一個後執行另一種方法是用一種很好的方法來捕捉所有執行功能的結果和/或錯誤。

https://github.com/caolan/async