簡體   English   中英

簡單的node.js應用程序控制流程

[英]Simple node.js app control flow

我對基本應用程序的控制流程有一個很簡單的問題。 我有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 ")        
        })
    })
})

話雖如此,以這樣的嵌套方式使用回調存在一個固有的缺點:“回調地獄”。 您可以考慮使用async的瀑布之類的內容或Promise庫來對函數進行模塊化。

優點:您還可以在ES6中編寫功能鏈更加簡潔:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM