[英]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.