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

时间:2018-06-22 05:00:19

标签: 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() {
  setTimeout(function() {
    console.log('Hi I am order 3');
  }, 1000);
}

f3();
f2();
f1();

3 个答案:

答案 0 :(得分:2)

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

在2018年,您可以将ES6与async / await一起使用:

let delay = (time) => new Promise((resolve) => setTimeout(resolve, time))

async function f1(){
  await delay(3000)
  console.log('Hi I am order 1')
}

async function f2() {
  await delay(2000)
  console.log('Hi I am order 2')
}

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

void async function run () {
  // It can be runned one-by-one
  await f1()
  await f2()
  await f3()
 
  // Or it can be runned in parallel
  // And then you lost ordering
  // await Promise.all([f3(), f2(), f1()])
} ()

答案 1 :(得分:1)

一些代码重构

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);
})();
  • 功能f1f2f3应该只专注于功能
  • 使用delay包装器延迟执行
  • 使用await确保同步执行

答案 2 :(得分:-1)

JavaScript Promises是同步不同函数的更好方法,但是更简单(尽管更难维护)的方法是在每个函数中添加一个自变量,以执行下一步需要调用的任何函数。

 ENOENT: no such file or directory, open '/layout/header.ejs'

另一种方法是像这样使用header.ejs函数本身:

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

但是,如果要进行任意嵌套,则此方法的灵活性较弱。

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