简单的node.js app控制流程

时间:2017-02-03 19:53:30

标签: javascript node.js asynchronous

我有关于基本应用程序控制流程的简单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中写入?或者我完全走错了路。你可以检查一下,给我一些提示,建议等等。非常感谢你的帮助。

1 个答案:

答案 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 ")        
)))