2017-02-03 57 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