Javascript Node.js如何同步执行以下功能

Javascript Node.js如何同步执行以下功能,javascript,node.js,Javascript,Node.js,我想在不改变时间的情况下同步执行下面的函数,输出为123。如何使用node.js function f1(){ setTimeout(function() { console.log('Hi I am order 1'); }, 3000); } function f2() { setTimeout(function() { console.log('Hi I am order 2'); }, 2000); } function f3() { setTim

我想在不改变时间的情况下同步执行下面的函数,输出为123。如何使用node.js

function f1(){
  setTimeout(function() {
    console.log('Hi I am order 1');
  }, 3000);
}

function f2() {
  setTimeout(function() {
    console.log('Hi I am order 2');
  }, 2000);
}

function f3() {
  setTimeout(function() {
    console.log('Hi I am order 3');
  }, 1000);
}

f3();
f2();
f1();
是同步不同函数的更好方法,但是一种更容易(尽管更难维护)的方法是为每个函数添加一个参数,该参数执行下一步需要调用的任何函数

function f1(func) { setTimeout(function() { console.log('Hi I am order 1'); func(); }, 3000); }

function f2(func) { setTimeout(function() { console.log('Hi I am order 2'); func(); }, 2000); }

function f3(func) { setTimeout(function() { console.log('Hi I am order 3'); func(); }, 1000); }

f1(f2(f3)));

另一种方法是使用
setTimeout
函数本身,如下所示:

function f1() { setTimeout(function() { console.log('Hi I am order 1'); f2(); }, 3000); }

function f2() { setTimeout(function() { console.log('Hi I am order 2'); f3(); }, 2000); }

function f3() { setTimeout(function() { console.log('Hi I am order 3'); }, 1000); }

f1();
但是,如果要进行任意嵌套,则此方法的灵活性较低


编辑:修复了第一个示例中的一个错误。

由于函数调用顺序,您的问题似乎不正确。看起来您想先调用f1()

2018年,您可以将ES6与异步/等待一起使用:

let delay=(时间)=>新承诺((解析)=>setTimeout(解析,时间))
异步函数f1(){
等待延迟(3000)
console.log('你好,我是订单1')
}
异步函数f2(){
等待延迟(2000年)
console.log('你好,我是订单2')
}
异步函数f3(){
等待延迟(1000)
console.log('Hi I am order 3');
}
void异步函数运行(){
//它可以一个接一个地运行
等待f1()
等待f2()
等待f3()
//或者它可以并行运行
//然后你就失去了秩序
//等待承诺。全部([f3(),f2(),f1())

}()
一点代码重构

function f1(){
    console.log('Hi I am order 1');
}

function f2() {
    console.log('Hi I am order 2');
}

function f3() {
    console.log('Hi I am order 3');
}

function delay(func, interval) {
    return new Promise(resolve => {
        setTimeout(() => {
            func();
            resolve();
        }, interval)
    })
}

(async () => {
    await delay(f1, 3000);
    await delay(f2, 2000);
    await delay(f3, 1000);
})();
  • 函数
    f1
    f2
    f3
    应该只关注它的功能
  • 使用
    delay
    wrapper延迟执行
  • 使用
    wait
    确保同步执行

您的超时值看起来正好相反。f3()应为3秒,f1()应为1秒。不是吗?更不用说不能保证超时会按预期的顺序发生。