ホームページ  >  記事  >  ウェブフロントエンド  >  node.js_node.js で同期操作を実装する 3 つの方法

node.js_node.js で同期操作を実装する 3 つの方法

WBOY
WBOYオリジナル
2016-05-16 16:29:011466ブラウズ

ご存知のとおり、非同期は独特の機能であり利点ですが、同時にプログラム内で同期が必要になります (たとえば、制御プログラムの実行順序は func1 -> func2 -> )。 func3) も非常に一般的です。この記事では、この問題に関する私の考えをいくつか記録します。

実行する必要がある関数:

コードをコピーします コードは次のとおりです:

var func1 = function(req,res,callback){
setTimeout(function(){
console.log('in func1');
コールバック(req,res,1);
},13000);
}
var func2 = function(req,res,callback){
setTimeout(function(){
console.log('in func2');
コールバック(req,res,2);
},5000);
}

var func3 = function(req,res,callback){
setTimeout(function(){
console.log('in func3');
コールバック(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);

出力内容:

コードをコピーします コードは次のとおりです:

func3
で func2
で func1

その理由は、nodejs が非同期であるため、func2 は func1 の実行が完了するのを待たずにすぐに実行するためです (func3 についても同様です)。 func3 の実行時間が最も短いため、func3 が最初に終了し、続いて func2、func1 が最後になります。しかし、これは明らかに私たちが望む結果ではありません。何をするか?

解決策 1: コールバック

コードをコピーします コードは次のとおりです:

//深いネスト
var req = null;
var res = null;

func1(req,res,function(){
func2(req,res,function(){
func3(req,res,function(){
プロセス.exit(0); })
});
});

この方法はすぐに解決できますが、明らかになった問題も明らかです。まず、コードのメンテナンスが不十分であり、次に、コードの深いネストが非常に不快に見えます。このアプローチはお勧めできません。

解決策 2: 再帰呼び出し

コードをコピーします コードは次のとおりです:
functionexecuteFunc(funcs,count,sum,req,res){
if(カウント == 合計){
戻る ;
}
それ以外{
funcs[カウント](req,req,function(){
カウント ;
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 の開発に伴い、対応するクラス ライブラリがますます増えています。 Step と async は良いものです。

1. Step の呼び出しは比較的新鮮です:


コードをコピー コードは次のとおりです:
ステップ(
関数 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);
}
]
);

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。