Вы можете использовать что-то вроде этого:
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])();