前言:
nodeJS最大的特點就是其異步操作,其后邊方法的執(zhí)行不會等到前邊方法執(zhí)行完才去運行狮斗,而是同時執(zhí)行好幾個方法牧抵,這種方式在給我們提高效率的同時也給開發(fā)多多少少帶來了不便灭袁,有時候我們不要求有這種效果的出現(xiàn)实昨,這時候就需要進行去異步操作洞豁。
node的去異步方式主要有三種:方法嵌套,遞歸調(diào)用,調(diào)用類庫
【實例代碼】
var func1 = function(req,res,callback){
setTimeout(function(){
console.log('執(zhí)行 func1');
callback(req,res,1);
},13000);
}
var func2 = function(req,res,callback){
setTimeout(function(){
console.log('執(zhí)行 func2');
callback(req,res,2);
},5000);
}
var func3 = function(req,res,callback){
setTimeout(function(){
console.log('執(zhí)行 func3');
callback(req,res,3);
},1000);
}
#可以看出在func1,func2和func3中都是用了setTimeout函數(shù)荒给,執(zhí)行的時間分別為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);
#打印結果(異步結果)
執(zhí)行 func3
執(zhí)行 func2
執(zhí)行 func1
#原因是因為nodejs是異步的曙咽,func2不會等func1執(zhí)行完畢后再執(zhí)行,而是立即執(zhí)行(func3也是如此)挑辆。由于func3的運行時間最短而率先結束例朱,func2次之,func1最后鱼蝉。但這明顯不是我們想要的結果茉继。怎么辦?
【處理去除異步效果】
(1):方法嵌套
var req = null;
var res = null;
func1(req,res,function(){
func2(req,res,function(){
func3(req,res,function(){
process.exit(0);
})
});
});
#這種方法雖然能快速的解決,但暴露的問題也很明顯蚀乔,一是代碼維護不方面,二是代碼的深層嵌套看起來很不舒服菲茬。這種方法并不可取吉挣。
嵌套處理異步實例:
(2):遞歸調(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);
#先將多個函數(shù)組成一個數(shù)組派撕。再可以利用遞歸函數(shù)的特性,使程序按照一定的順序執(zhí)行睬魂。
(3):調(diào)用類庫 Step和async
#隨著nodejs的發(fā)展终吼,響應的類庫也越來越多。Step和async 就是其中不錯的氯哮。
# 方式一: Step實現(xiàn) 即用step方法將要實現(xiàn)同步的方法包裹起來
Step(
function thefunc1(){
console.log(finishFlag);
func1(this);
},
function thefunc2(finishFlag){
console.log(finishFlag);
func2(this);
},
function thefunc3(finishFlag){
console.log(finishFlag);
func3(this);
}
);
# 方式二:async實現(xiàn) 其本質(zhì)是使用async 的 series方法實現(xiàn)
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);
}
]
);