サーチ…


構文

  • 各コールバックは、次の構文で記述する必要があります。

  • 関数コールバック(err、result [、arg1 [、...]])

  • この方法では、まずエラーを返すように強制され、後でエラーを処理することは無視できません。 nullはエラーがない場合の規約です

  • コールバック(null、myResult);

  • あなたのコールバックはerrresultよりも多くの引数を含むことができますが、特定の関数群(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'] //結果



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow