Javascript 如何使setTimeout()函数按顺序工作?

Javascript 如何使setTimeout()函数按顺序工作?,javascript,Javascript,假设我有4个函数,每个函数内部都有使用setTimeout()的循环。如何使这些函数按顺序运行而不重叠?也就是说,如何使它们在前一个完成后立即执行 function1(); function2(); function3(); function4(); 让每个函数在完成后调用下一个函数 如果要使其“动态”,请实现一个函数队列,并让每个函数在完成后调用队列中的下一个函数。然后,您可以通过填充队列并调用第一个函数来启动顺序进程。让每个函数在完成后调用下一个函数 function function1

假设我有4个函数,每个函数内部都有使用
setTimeout()
的循环。如何使这些函数按顺序运行而不重叠?也就是说,如何使它们在前一个完成后立即执行

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

让每个函数在完成后调用下一个函数


如果要使其“动态”,请实现一个函数队列,并让每个函数在完成后调用队列中的下一个函数。然后,您可以通过填充队列并调用第一个函数来启动顺序进程。

让每个函数在完成后调用下一个函数

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

function1(function() {
    function2(function() {
        function3(function() {
            function4();
        });
    });
});
如果要使其“动态”,请实现一个函数队列,并让每个函数在完成后调用队列中的下一个函数。然后,您可以通过填充队列并调用第一个函数来启动顺序进程

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

function1(function() {
    function2(function() {
        function3(function() {
            function4();
        });
    });
});
如果你做得太深,代码会变得很混乱,所以使用一些流控制,比如。但如果不是节点,则步骤可能无法工作

简单队列可能是:

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);
var队列={
项目:[],
添加:函数(){
for(var i=0;i
这里,每个函数都应将函数参数
done
作为其第一个参数,并且在函数完成时应调用该参数

如果你做得太深,代码会变得很混乱,所以使用一些流控制,比如。但如果不是节点,则步骤可能无法工作

简单队列可能是:

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);
var队列={
项目:[],
添加:函数(){
for(var i=0;i

在这里,每个函数都应将函数参数
done
作为其第一个参数,并在函数完成时调用该参数。

您可以传递一个函数数组

和具有参数的函数本身作为数组

在为下一个功能设置计时器之前,每个都必须返回

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);

可以传递一组函数

和具有参数的函数本身作为数组

在为下一个功能设置计时器之前,每个都必须返回

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);