我有一个关于基本应用程序控制流的简单菜鸟问题。我有 3 个带有 setTimeout 的函数。
console.log("[+] Program start");
function first(){
setTimeout(function(){
console.log(1);
},3000);}
function second(){
setTimeout(function(){
console.log(2);
},2000);}
function third(){
setTimeout(function(){
console.log(3);
},1000);}
first();
second();
third();
console.log("done");
输出符合预期:
[+] Program start
done
3
2
1
我想控制流程,我将按以下顺序查看内容:
[+] Program start
1
2
3
done
所以我通过以下方式重写了程序:
console.log("[+] Program start");
function first(){
setTimeout(function(){
console.log(1);
second();
},3000);}
function second(){
setTimeout(function(){
console.log(2);
third();
},2000);}
function third(){
setTimeout(function(){
console.log(3);
call();
},1000);}
first();
function call(){console.log("done ");}
输出是:
[+] Program start
1
2
3
done
现在输出已经可以了,请问一下,这种做法对吗?这是如何控制流程或如何在node.js中编写的正确方法?或者我完全走错路了。您能否检查一下并给我一些提示、建议等。非常感谢您的帮助。
最佳答案
如果您尝试管理操作顺序,您绝对不希望使用 setTimeout()
来执行此操作。 setTimeout()
旨在阻止线程执行直到完成,使用这种方式会使您的应用程序异常脆弱。
假设您只是想管理流程,请阅读 Node.js 事件循环的工作原理。以这种方式编写的代码将如下所示(我在其中添加了一些 setTimeout()
函数来模拟/说明长时间运行的函数):
console.log("[+] Program start")
var first = function(callback) {
setTimeout(function() {
console.log(1)
callback()
}, 1000)
}
var second = function(callback) {
setTimeout(function() {
console.log(2)
callback()
}, 1000)
}
var third = function(callback) {
setTimeout(function() {
console.log(3)
callback()
}, 1000)
}
first(function() {
second(function() {
third(function() {
console.log("done ")
})
})
})
话虽如此,以这样的嵌套方式使用回调有一个固有的缺点:“回调 hell ”。您可以考虑使用类似async
之类的东西来模块化您的功能。的 waterfall ,或者 Promise 库。
加分点:您还可以在 ES6 中更简洁地编写函数链:
first(() => second(() => third(() =>
console.log("done ")
)))
关于javascript - 简单的 Node.js 应用程序控制流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42032031/