node.js中實作同步操作的3種實作方法_node.js
眾所周知,非同步是得天獨厚的特點和優勢,但同時在程式中同步的需求(例如控製程式的執行順序為:func1 -> func2 ->func3 )也是很常見的。本文就是對這個問題記錄自己的一些想法。
需要執行的函數:
var func1 = function(req,res,callback){
setTimeout(function(){
console.log('in func1');
callback(req,res,1);
},13000);
}
var func2 = function(req,res,callback){
setTimeout(function(){
console.log('in func2');
callback(req,res,2);
},5000);
}
var func3 = function(req,res,callback){
setTimeout(function(){
console.log('in func3');
callback(req,res,3);
},1000);
}
可以看出在func1,func2和func3中都是用了setTimeout函數,執行的時間分別為13秒,5秒和1秒。由於nodejs異步的特性,如果使用普通的函數呼叫方法:
var req = null;
var res = null;
var callback = function(){};
func1(req,res,callback);
func2(req,res,callback);
func3(req,res,callback);
輸出內容:
in func3
in func2
in func1
原因是因為nodejs是異步的,func2不會等func1執行完畢後再執行,而是立即執行(func3也是如此)。由於func3的運行時間最短而率先結束,func2次之,func1最後。但這明顯不是我們想要的結果。怎麼辦?
解決方法一:callback
//深層巢狀
var req = null;
var res = null;
func1(req,res,function(){
func2(req,res,function(){
func3(req,res,function(){
process.exit(0);
})
});
});
這種方法雖然能快速的解決,但暴露的問題也很明顯,一是程式碼維護不方面,二是程式碼的深層嵌套看起來很不舒服。這種方法並不可取。
解決方法二:遞迴呼叫
function executeFunc(funcs,count,sum,req,res){
if(count == sum){
return ;
}
else{
funcs[count](req,req,function(){
count ;
executeFunc(funcs,count,sum,req,res);
});
}
}
//同步呼叫
var req = null;
var res = null;
var funcs = [func1,func2,func3];
var len = funcs.length;
executeFunc(funcs,0,len,req,res);
先將多個函數組成一個陣列。再可以利用遞歸函數的特性,使程式依照一定的順序執行。
解決方法三:呼叫類別庫
隨著nodejs的發展,回應的類別庫也越來越多。 Step和async 就是其中不錯的。
1.Step的調用相對較為清爽:
Step(
function thefunc1(){
func1(this);
},
function thefunc2(finishFlag){
console.log(finishFlag);
func2(this);
},
function thefunc3(finishFlag){
console.log(finishFlag);
}
);
2.async 的 series方法,就本例而言,它的呼叫方法:
var req = null;
var res = null;
var callback = function(){};
async.series(
[
function(callback){
func1(req,res,callback);
},
function(callback){
func2(req,res,callback);
},
function(callback){
func3(req,res,callback);
}
]
);

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

基於無阻塞、事件驅動建立的Node服務,具有記憶體消耗低的優點,非常適合處理海量的網路請求。在海量請求的前提下,就需要考慮「記憶體控制」的相關問題了。 1. V8的垃圾回收機制與記憶體限制 Js由垃圾回收機

文件模組是對底層文件操作的封裝,例如文件讀寫/打開關閉/刪除添加等等文件模組最大的特點就是所有的方法都提供的**同步**和**異步**兩個版本,具有sync 字尾的方法都是同步方法,沒有的都是異

選擇一個Node的Docker映像看起來像是小事,但是映像的大小和潛在漏洞可能會對你的CI/CD流程和安全造成重大的影響。那我們要如何選擇一個最好Node.js Docker映像呢?

Node 19已正式發布,以下這篇文章就來帶大家詳解了解Node.js 19的 6 大特性,希望對大家有幫助!

node無法用npm指令是因為沒有正確配置環境變量,其解決方法是:1、開啟“系統屬性”;2、找到“環境變數”->“系統變數”,然後編輯環境變數;3、找到nodejs所在的資料夾;4、點選「確定」即可。

事件循環是 Node.js 的基本組成部分,透過確保主執行緒不被阻塞來實現非同步編程,了解事件循環對建立高效應用程式至關重要。以下這篇文章就來帶大家深入了解Node中的事件循環 ,希望對大家有幫助!
