我想在不更改时间的情况下同步执行以下功能,输出将是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();
答案 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);
})();
f1
,f2
和f3
应该只专注于功能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)));
但是,如果要进行任意嵌套,则此方法的灵活性较弱。
编辑:修正了我的第一个示例中的错误。