Node.js
async.js
サーチ…
構文
各コールバックは、次の構文で記述する必要があります。
関数コールバック(err、result [、arg1 [、...]])
この方法では、まずエラーを返すように強制され、後でエラーを処理することは無視できません。
null
はエラーがない場合の規約ですコールバック(null、myResult);
あなたのコールバックはerrやresultよりも多くの引数を含むことができますが、特定の関数群(waterfall、seq、...)
コールバック(null、myResult、myCustomArgument);
もちろん、エラーを送信します。あなたはそれをしなければならず、エラーを処理しなければなりません。
コールバック(エラー);
パラレル:マルチタスキング
async.parallel(tasks、afterTasksCallback)は、一連のタスクを並行して実行し、すべてのタスクの終了を待機します( コールバック関数の呼び出しによって報告されます)。
タスクが終了すると、 asyncはすべてのエラーとタスクのすべての結果でメインコールバックを呼び出します。
function shortTimeFunction(callback) {
setTimeout(function() {
callback(null, 'resultOfShortTime');
}, 200);
}
function mediumTimeFunction(callback) {
setTimeout(function() {
callback(null, 'resultOfMediumTime');
}, 500);
}
function longTimeFunction(callback) {
setTimeout(function() {
callback(null, 'resultOfLongTime');
}, 1000);
}
async.parallel([
shortTimeFunction,
mediumTimeFunction,
longTimeFunction
],
function(err, results) {
if (err) {
return console.error(err);
}
console.log(results);
});
結果: ["resultOfShortTime", "resultOfMediumTime", "resultOfLongTime"]
。
オブジェクトでasync.parallel()
を呼び出す
タスク配列パラメータをオブジェクトで置き換えることができます。この場合、結果はタスクと同じキーを持つオブジェクトにもなります。
いくつかのタスクを計算し、それぞれの結果を簡単に見つけることは非常に便利です。
async.parallel({
short: shortTimeFunction,
medium: mediumTimeFunction,
long: longTimeFunction
},
function(err, results) {
if (err) {
return console.error(err);
}
console.log(results);
});
結果: {short: "resultOfShortTime", medium: "resultOfMediumTime", long: "resultOfLongTime"}
複数の値を解決する
各並列関数にコールバックが渡されます。このコールバックは、最初の引数としてエラーを返したり、それ以降の成功値を返すことができます。いくつかの成功値がコールバックに渡された場合、これらの結果は配列として返されます。
async.parallel({
short: function shortTimeFunction(callback) {
setTimeout(function() {
callback(null, 'resultOfShortTime1', 'resultOfShortTime2');
}, 200);
},
medium: function mediumTimeFunction(callback) {
setTimeout(function() {
callback(null, 'resultOfMediumTime1', 'resultOfMeiumTime2');
}, 500);
}
},
function(err, results) {
if (err) {
return console.error(err);
}
console.log(results);
});
結果:
{
short: ["resultOfShortTime1", "resultOfShortTime2"],
medium: ["resultOfMediumTime1", "resultOfMediumTime2"]
}
。
シリーズ:独立したモノタスク
async.series(tasks、afterTasksCallback)は一連のタスクを実行します。各タスクは別々に実行されます。 タスクが失敗すると、 asyncはすぐに実行を停止し、メインのコールバックにジャンプします 。
タスクが正常に終了すると、 asyncは、すべてのエラーとすべてのタスク結果を含む「マスター」コールバックを呼び出します。
function shortTimeFunction(callback) {
setTimeout(function() {
callback(null, 'resultOfShortTime');
}, 200);
}
function mediumTimeFunction(callback) {
setTimeout(function() {
callback(null, 'resultOfMediumTime');
}, 500);
}
function longTimeFunction(callback) {
setTimeout(function() {
callback(null, 'resultOfLongTime');
}, 1000);
}
async.series([
mediumTimeFunction,
shortTimeFunction,
longTimeFunction
],
function(err, results) {
if (err) {
return console.error(err);
}
console.log(results);
});
結果: ["resultOfMediumTime", "resultOfShortTime", "resultOfLongTime"]
。
オブジェクトでasync.series()
を呼び出す
タスク配列パラメータをオブジェクトで置き換えることができます。この場合、結果はタスクと同じキーを持つオブジェクトにもなります。
いくつかのタスクを計算し、それぞれの結果を簡単に見つけることは非常に便利です。
async.series({
short: shortTimeFunction,
medium: mediumTimeFunction,
long: longTimeFunction
},
function(err, results) {
if (err) {
return console.error(err);
}
console.log(results);
});
結果: {short: "resultOfShortTime", medium: "resultOfMediumTime", long: "resultOfLongTime"}
滝:従属モノタスク
async.waterfall(tasks、afterTasksCallback)は一連のタスクを実行します。各タスクは次々に実行され、タスクの結果は次のタスクに渡されます 。 async.series()として、タスクが失敗した場合、 asyncは実行を停止し、メインのコールバックを直ちに呼び出します。
タスクが正常に終了すると、 asyncは、すべてのエラーとすべてのタスク結果を含む「マスター」コールバックを呼び出します。
function getUserRequest(callback) {
// We simulate the request with a timeout
setTimeout(function() {
var userResult = {
name : 'Aamu'
};
callback(null, userResult);
}, 500);
}
function getUserFriendsRequest(user, callback) {
// Another request simulate with a timeout
setTimeout(function() {
var friendsResult = [];
if (user.name === "Aamu"){
friendsResult = [{
name : 'Alice'
}, {
name: 'Bob'
}];
}
callback(null, friendsResult);
}, 500);
}
async.waterfall([
getUserRequest,
getUserFriendsRequest
],
function(err, results) {
if (err) {
return console.error(err);
}
console.log(JSON.stringify(results));
});
結果: results
は、その場合のfriendsResult
である滝の最後の関数の2番目のコールバックパラメータが含まれます。
async.times(より良い方法でforループを処理するため)
node.jsのループ内で関数を実行するには、短いループのfor
ループを使用するのがよいでしょう。しかし、ループが長いと、 for
ループを使用for
と処理時間が長くなり、ノード・プロセスがハングアップする可能性があります。このようなシナリオでは、 asycn.times
function recursiveAction(n, callback)
{
//do whatever want to do repeatedly
callback(err, result);
}
async.times(5, function(n, next) {
recursiveAction(n, function(err, result) {
next(err, result);
});
}, function(err, results) {
// we should now have 5 result
});
これは並行して呼び出されます。一度に1つずつ呼び出す場合は、 async.timesSeriesを使用します。
async.each(データの配列を効率的に処理するため)
我々は、データの配列を処理したいときは、より良いasync.eachを使用する。すべてのデータを使って何かを実行したいときに、すべてが完了したら最後のコールバックを取得したいとき、このメソッドは便利です。これは並行して処理されます。
function createUser(userName, callback)
{
//create user in db
callback(null)//or error based on creation
}
var arrayOfData = ['Ritu', 'Sid', 'Tom'];
async.each(arrayOfData, function(eachUserName, callback) {
// Perform operation on each user.
console.log('Creating user '+eachUserName);
//Returning callback is must. Else it wont get the final callback, even if we miss to return one callback
createUser(eachUserName, callback);
}, function(err) {
//If any of the user creation failed may throw error.
if( err ) {
// One of the iterations produced an error.
// All processing will now stop.
console.log('unable to create user');
} else {
console.log('All user created successfully');
}
});
一度に1つずつ行うにはasync.eachSeriesを使用できます
async.series(イベントを1つずつ処理する)
/ async.seriesでは、すべての関数が直列に実行され、各関数の統合出力が最終コールバックに渡されます。例えば /
var async = require( 'async'); async.series([function(callback){(最初の実行..)}; callback(null、 'userPersonalData');}、関数(コールバック){console.log( 'Second Execute ..');コールバック(null、 'userDependentData');}]、関数(エラー、結果){console.log(結果);});
//出力:
最初の実行.. 2番目の実行.. ['userPersonalData'、 'userDependentData'] //結果