node.js中實(shí)現(xiàn)同步操作的3種實(shí)現(xiàn)方法
眾所周知,異步是得天獨(dú)厚的特點(diǎn)和優(yōu)勢(shì),但同時(shí)在程序中同步的需求(比如控制程序的執(zhí)行順序?yàn)椋篺unc1 -> func2 ->func3 )也是很常見的。本文就是對(duì)這個(gè)問(wèn)題記錄自己的一些想法。
需要執(zhí)行的函數(shù):
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函數(shù),執(zhí)行的時(shí)間分別為13秒,5秒和1秒。由于nodejs異步的特性,如果使用普通的函數(shù)調(diào)用方法:
var req = null;
var res = null;
var callback = function(){};
func1(req,res,callback);
func2(req,res,callback);
func3(req,res,callback);
輸出內(nèi)容:
in func3
in func2
in func1
原因是因?yàn)閚odejs是異步的,func2不會(huì)等f(wàn)unc1執(zhí)行完畢后再執(zhí)行,而是立即執(zhí)行(func3也是如此)。由于func3的運(yùn)行時(shí)間最短而率先結(jié)束,func2次之,func1最后。但這明顯不是我們想要的結(jié)果。怎么辦?
解決辦法一:callback
//深層嵌套
var req = null;
var res = null;
func1(req,res,function(){
func2(req,res,function(){
func3(req,res,function(){
process.exit(0);
})
});
});
這種方法雖然能快速的解決,但暴露的問(wèn)題也很明顯,一是代碼維護(hù)不方面,二是代碼的深層嵌套看起來(lái)很不舒服。這種方法并不可取。
解決方法二:遞歸調(diào)用
function executeFunc(funcs,count,sum,req,res){
if(count == sum){
return ;
}
else{
funcs[count](req,req,function(){
count++;
executeFunc(funcs,count,sum,req,res);
});
}
}
//同步調(diào)用
var req = null;
var res = null;
var funcs = [func1,func2,func3];
var len = funcs.length;
executeFunc(funcs,0,len,req,res);
先將多個(gè)函數(shù)組成一個(gè)數(shù)組。再可以利用遞歸函數(shù)的特性,使程序按照一定的順序執(zhí)行。
解決方法三:調(diào)用類庫(kù)
隨著nodejs的發(fā)展,響應(yīng)的類庫(kù)也越來(lái)越多。Step和async 就是其中不錯(cuò)的。
1.Step的調(diào)用相對(duì)比較清爽:
Step(
function thefunc1(){
func1(this);
},
function thefunc2(finishFlag){
console.log(finishFlag);
func2(this);
},
function thefunc3(finishFlag){
console.log(finishFlag);
}
);
2.async 的 series方法,就本例而言,它的調(diào)用方法:
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);
}
]
);
相關(guān)文章
nodejs個(gè)人博客開發(fā)第一步 準(zhǔn)備工作
這篇文章主要為大家詳細(xì)介紹了nodejs個(gè)人博客開發(fā)的準(zhǔn)備工作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04node.js使用express框架進(jìn)行文件上傳詳解
在本篇內(nèi)容里小編給大家整理了關(guān)于node.js使用express框架進(jìn)行文件上傳的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們跟著學(xué)習(xí)下。2019-03-03Node.js npm命令運(yùn)行node.js腳本的方法
今天小編就為大家分享一篇Node.js npm命令運(yùn)行node.js腳本的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10node.js文件上傳重命名以及移動(dòng)位置的示例代碼
本篇文章主要介紹了node.js文件上傳重命名以及移動(dòng)位置的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01Node.js API詳解之 module模塊用法實(shí)例分析
這篇文章主要介紹了Node.js API詳解之 module模塊用法,結(jié)合實(shí)例形式分析了Node.js API中module模塊基本功能、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-05-05Node.js實(shí)現(xiàn)鏈?zhǔn)交卣{(diào)
這篇文章介紹了Node.js實(shí)現(xiàn)鏈?zhǔn)交卣{(diào)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07nodejs實(shí)現(xiàn)發(fā)出蜂鳴聲音(系統(tǒng)報(bào)警聲)的方法
這篇文章主要介紹了nodejs實(shí)現(xiàn)發(fā)出蜂鳴聲音(系統(tǒng)報(bào)警聲)的方法,結(jié)合實(shí)例形式分析了nodejs發(fā)出蜂鳴聲的原理及具體應(yīng)用方法,需要的朋友可以參考下2017-01-01node.js中的path.delimiter方法使用說(shuō)明
這篇文章主要介紹了node.js中的path.delimiter方法使用說(shuō)明,本文介紹了path.delimiter的方法說(shuō)明、語(yǔ)法、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12