誰もが知っているように、非同期はユニークな機能と利点ですが、同時に、プログラムの同期の必要性(たとえば、制御プログラムの実行順序は次のとおりです。この記事では、この問題に関する私の考えのいくつかを記録しています。
実行する機能:
コードコピーは次のとおりです。
var func1 = function(req、res、callback){
setimeout(function(){
console.log( 'in func1');
コールバック(req、res、1);
}、13000);
}
var func2 = function(req、res、callback){
setimeout(function(){
console.log( 'in func2');
コールバック(req、res、2);
}、5000);
}
var func3 = function(req、res、callback){
setimeout(function(){
console.log( 'in func3');
コールバック(req、res、3);
}、1000);
}
FUNC1、FUNC2、およびFUNC3では、実行時間はそれぞれ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);
出力コンテンツ:
コードコピーは次のとおりです。
FUNC3で
FUNC2で
func1
その理由は、nodejsが非同期であるため、func2はfunc1が実行される前に実行されるのを待つことはありませんが、すぐに実行されます(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:再帰通話
コードコピーは次のとおりです。
function executefunc(funcs、count、sum、req、res){
if(count == sum){
戻る ;
}
それ以外{
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);
まず、複数の関数が配列に形成されます。その後、再帰関数の特性を使用して、プログラムを特定の順序で実行させることができます。
ソリューション3:クラスライブラリを呼び出します
Nodejsの開発により、応答するクラスライブラリがますます増えています。ステップとアセンキは良いものです。
1.ステップへの呼び出しは比較的リフレッシュです:
コードコピーは次のとおりです。
ステップ(
機能thefunc1(){
func1(this);
}、
function thefunc2(finishflag){
console.log(finishflag);
func2(this);
}、
function theFunc3(finishflag){
console.log(finishflag);
}
);
2。ASYNCのシリーズ方法、この場合、その呼び出し方法:
コードコピーは次のとおりです。
var req = null;
var res = null;
var callback = function(){};
async.series(
[
関数(コールバック){
func1(req、res、callback);
}、
関数(コールバック){
func2(req、res、callback);
}、
関数(コールバック){
func3(req、res、callback);
}
]
);