2017-02-03 26 views
0

我有关于基本应用程序的控制流的简单noob问题。我有3个与setTimeout函数里面。简单的node.js应用程序控制流程

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

为什么你要使用的setTimeout?你想做什么?告诉我们更多关于你的问题。没有这个,你的问题太宽泛,无法给你一个有效的答案 –

+0

你做什么是很奇怪的,至少可以说。对于一般的异步事情,结帐:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise –

回答

1

如果您尝试管理操作顺序,您绝对不希望使用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 ")   
     }) 
    }) 
}) 

说了这么多,有一个固有的缺点使用以这样的嵌套方式回调:“callback hell”。你可以考虑使用诸如async的瀑布之类的模块化功能,或者使用Promise库。

加分点:你也可以写函数链中ES6相当多的简明:

first(() => second(() => third(() => 
    console.log("done ")   
))) 
+0

谢谢。我使用setTimeout仅用于测试,我试图模拟一些在有限的时间内运行的工作。这可以读取文件或类似的东西。我的意图是知道如何控制流量。非常感谢你。 – Mischa

+0

好的 - 我为了说明的目的添加了一些内容。 – brandonscript

+0

谢谢布兰登,终于我开始理解短语回调地狱:)这将是很高兴看到你的解决方案与异步库。无论如何非常感谢你:) – Mischa