如何按顺序运行javascript函数并等待每个函数完成

如何按顺序运行javascript函数并等待每个函数完成,javascript,Javascript,基本上,我有三个函数,我想要的是按顺序(同步)运行所有这三个函数,每个函数等待前一个函数完成。我在函数中设置了超时来模拟时间执行,我不知道这是否有效。我的密码是 //my three functions... function wait1() { setTimeout(function(){ console.log('hello, this is the function 1'); return 'ok'; },2000) } function

基本上,我有三个函数,我想要的是按顺序(同步)运行所有这三个函数,每个函数等待前一个函数完成。我在函数中设置了超时来模拟时间执行,我不知道这是否有效。我的密码是

//my three functions...
function wait1() {
    setTimeout(function(){
        console.log('hello, this is the function 1');
        return 'ok';
    },2000)
}

function wait2() {
    setTimeout(function(){
        console.log('hello, this is the function 2');
        return 'ok';
    },2000)
}

function wait3() {
    setTimeout(function(){
        console.log('hello, this is the function 3');
        return 'ok';
    },2000)
}

var tasks = [wait1,wait2,wait3];
var counter = 0;

function iterateTasks(tasks) {
    runSequence(tasks[counter], function(){
        counter++;
        if(counter < tasks.length) {
            iterateTasks(tasks);
        }
    });
}

//@params func   received function
//@params cb   received callback function
function runSequence(func,cb) {
    var timeout = 0;
    var tmr = setInterval(function(){
        if(func() === 'ok' || timeout === 5000) {
            console.log('OK, func = ', func);
            cb();
            clearInterval(tmr); 
            timeout = 0;
        }
        timeout += 500;
    },500);
}

//start program...
iterateTasks(tasks);
//我的三个函数。。。
函数wait1(){
setTimeout(函数(){
log('hello,这是函数1');
返回“ok”;
},2000)
}
函数wait2(){
setTimeout(函数(){
log('hello,这是函数2');
返回“ok”;
},2000)
}
函数wait3(){
setTimeout(函数(){
log('hello,这是函数3');
返回“ok”;
},2000)
}
var tasks=[wait1,wait2,wait3];
var计数器=0;
函数迭代任务(任务){
运行序列(任务[计数器],函数(){
计数器++;
if(计数器<任务长度){
迭代任务;
}
});
}
//@params func接收函数
//@params cb接收回调函数
函数运行序列(func,cb){
var超时=0;
var tmr=setInterval(函数(){
如果(func()=='ok'| |超时===5000){
log('OK,func=',func');
cb();
清除间隔(tmr);
超时=0;
}
超时+=500;
},500);
}
//启动程序。。。
迭代任务;

谢谢你的帮助

尝试向每个函数添加回调:

//my three functions...
function wait1(callback) {
    setTimeout(function(){
        console.log('hello, this is the function 1');
        callback('ok');
    },2000)
}

function wait2(callback) {
    setTimeout(function(){
        console.log('hello, this is the function 2');
        callback('ok');
    },2000)
}

function wait3(callback) {
    setTimeout(function(){
        console.log('hello, this is the function 3');
        callback('ok');
    },2000)
}

var tasks = [wait1,wait2,wait3];
var counter = 0;

function iterateTasks(tasks, callback) {
    setTimeout(function req(){
        tasks[counter++](function(value) {
            if (counter == tasks.length) {
                if (typeof callback == 'function') {
                    callback();
                }
            } else if (value === 'ok') {
                setTimeout(req, 500);
            }
        });
    }, 500);
}

//start program...
iterateTasks(tasks);

承诺是很好的,但您也可以通过生成器的惰性评估来完成这项工作。让我们看看如何实现它

function*runner(函数,文本){
var=文本;
for(函数的形式){
val=收益率(val);
}
}
函数wait1(t){
setTimeout(函数(){
控制台日志(t+“1”);
it.next(t);
},2000);
}
函数2(t){
setTimeout(函数(){
控制台日志(t+“2”);
it.next(t);
},2000);
}
函数wait3(t){
setTimeout(函数(){
控制台日志(t+“3”);
it.next(t);
},2000);
}
var tasks=[wait1,wait2,wait3],
it=runner(任务,“您好,这是函数#”);

it.next();//启动引擎问题是什么?是否希望它们在每个函数超时完成后运行?最好的方法是提示setTimeout并使用promises控件排序。不能使用异步方法返回。调用代码将不会等待。您应该研究回调或更好的承诺。使用
承诺
,ES5没有这个功能,但您需要使用像
jQuery
这样的库或像
AngularJS
这样的框架,而闪亮的新事物很有趣。。。很容易兑现ES2015之前非本地存在的承诺。。。polyfill ES2017是不可能的generators@JaromandaX生成器是ES6的一部分,承诺也是。ES7中有一些变化(他们将不再有构造函数),但这并没有改变这样一个事实,即他们完全可以在与ES6兼容的各种环境中使用。我只是不想对这个答案投反对票,因为它给出了一个以本文未提及的正确方式处理工作的想法。我们,作为网站开发者,仍然有很多internet explorer用户需要支持——是的,这让我想把我的阴毛撕下来,但这是事实。我的评论并不是对代码或答案的批评,评论只是指出在这样的浏览器中无法实现这一点(是的,我夸大了ES2017,我很惊讶它们实际上是ES2015的一部分,我以为它们是ES2016:p