수색…


통사론

  • 각 콜백은 다음 구문으로 작성해야합니다.

  • 함수 콜백 (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()

작업 배열 매개 변수를 객체로 바꿀 수 있습니다. 이 경우 결과는 작업과 동일한 키를 가진 개체이기도 합니다 .

몇 가지 작업을 계산하고 각 결과를 쉽게 찾을 수있어 매우 유용합니다.

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()

작업 배열 매개 변수를 객체로 바꿀 수 있습니다. 이 경우 결과는 작업과 동일한 키를 가진 개체이기도 합니다 .

몇 가지 작업을 계산하고 각 결과를 쉽게 찾을 수있어 매우 유용합니다.

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 에는 폭포의 마지막 기능에 대한 두 번째 콜백 매개 변수 인 friendsResultfriendsResult 됩니다.

async.times (더 나은 방법으로 for 루프를 처리하기 위해)

node.js의 루프 내에서 함수를 실행하려면 짧은 루프에 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
});

이것은 병렬로 호출됩니다. 한 번에 하나씩 호출하려면 다음을 사용하십시오. 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');
    }
});

한 번에 하나씩 수행하려면 async.eachSeries 를 사용할 수 있습니다 .

async.series (이벤트를 하나씩 처리하기 위해)

/ async.series에서 모든 함수가 직렬로 실행되고 각 함수의 통합 출력이 최종 콜백으로 전달됩니다. 예 /

var async = require ( 'async'); async.series (function (callback) {console.log ( 'First Execute ..'); 콜백 (null, 'userPersonalData');} 함수 (콜백) {console.log ( 'Second Execute ..'); 콜백 (null, 'userDependentData');}], 함수 (오류, 결과) {console.log (result);});

//산출:

첫 번째 실행 .. 둘째 실행 .. [ 'userPersonalData', 'userDependentData'] // 결과



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow