どうやってnodejsを同期させますか?

5073 ワード

周知のように、非同期はnodejsの中でとりわけ恵まれた特徴と優勢であるが、同時にプログラムの中で同期する必要がある(例えば、制御プログラムの実行順序は:func 1->>func 2->func 3)こともよくある.本文はこの問題に対して自分の考えを記録します.
     実行する関数:
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);
}
      func 1,func 2,func 3のいずれも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は非同期であり、Fnc 2はFnc 1の実行を待って実行するのではなく、直ちに実行するからです.func 3の運転時間が一番短いので、率先して終了します.func 2回、func 1は最後です.しかし、これは明らかに私たちが望んだ結果ではないです.どうすればいいですか
     解決方法1:calback
//    
var req = null;
var res = null;

func1(req,res,function(){
func2(req,res,function(){
func3(req,res,function(){
process.exit(0);
})
});
});
     この方法は急速に解決できるが,暴露の問題も明らかであるが,一つはコードの維持が不十分であり,もう一つはコードの深層ネストが不快に見えることである.この方法は取るべきものではない.
     
     解決方法2:再帰的呼び出し
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);
        まず、複数の関数を1つの配列にします.再帰関数の特性を利用して、プログラムを一定の順序で実行することができます.
         
        解決方法3:クラスライブラリの呼び出し 
       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);
}
]
);