我有关于基本应用程序控制流程的简单noob问题。我有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中写入?或者我完全走错了路。你可以检查一下,给我一些提示,建议等等。非常感谢你的帮助。
答案 0 :(得分:2)
如果您正在尝试管理操作顺序,那么您绝对不想使用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 ")
})
})
})
话虽如此,以这样的嵌套方式使用回调有一个固有的缺点:"回调地狱"。您可以考虑使用async
瀑布或Promise库等模块化您的功能。
奖励积分:您还可以更简洁地在ES6中编写功能链:
first(() => second(() => third(() =>
console.log("done ")
)))