Async: 였λ₯˜κ°€ λ°œμƒν•œ ν›„ async.map ()μ—μ„œ μ²˜λ¦¬λ˜μ§€ μ•Šμ€ ν•­λͺ©μ„ ν™•μΈν•˜λŠ” 방법

에 λ§Œλ“  2017λ…„ 07μ›” 10일  Β·  5μ½”λ©˜νŠΈ  Β·  좜처: caolan/async

μ•ˆλ…•ν•˜μ„Έμš”,

map (...)을 μ‚¬μš©ν•˜λŠ” λ™μ•ˆ iteratee ν•¨μˆ˜μ—μ„œ λ°œμƒν•œ 였λ₯˜λ₯Ό μ²˜λ¦¬ν•˜μ—¬ 제곡된 μ»¬λ ‰μ…˜μ—μ„œ 아직 μ²˜λ¦¬λ˜μ§€ μ•Šμ€ ν•­λͺ© 수λ₯Ό 확인할 μˆ˜μžˆλŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

map 을 (λ₯Ό) μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ urlsparams 배열에 λŒ€ν•΄ μ—¬λŸ¬ λ°œμ‹  HTTP μš”μ²­ (λ…Έλ“œ request 라이브러리 μ‚¬μš©)을 μˆ˜ν–‰ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μš”μ²­μ„ μˆ˜ν–‰ν•˜λŠ” κ³Όμ •μ—μ„œ νŠΉμ • 였λ₯˜κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. 처리 ν•  μˆ˜μžˆλŠ” λŒ€μƒ μ„œλ²„μ—μ„œ μž‘μ—…μ€‘μΈ ν˜„μž¬ ν•­λͺ©κ³Ό map κ°€ 아직 μ„ νƒν•˜μ§€ μ•Šμ€ λ‚˜λ¨Έμ§€ ν•­λͺ©μ„ λ‹€μ‹œ μ²˜λ¦¬ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

(였λ₯˜μ—†μ΄) μ„±κ³΅μ μœΌλ‘œ μž‘μ—… ν•œ λ‚΄ μ»¬λ ‰μ…˜μ˜ 각 ν•­λͺ©μ— ν”Œλž˜κ·Έλ₯Ό μ„€μ • ν•œ λ‹€μŒ λ‚΄κ°€ κ΄€μ‹¬μžˆλŠ” 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ μ μ ˆν•˜κ²Œ 처리 ν•  수 β€‹β€‹μžˆλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€. 그런 λ‹€μŒ 아직 μ²˜λ¦¬λ˜μ§€ μ•Šμ€ ν•­λͺ©μ— λŒ€ν•΄ ν”Œλž˜κ·Έκ°€ false둜 μ„€μ •λœ ν•­λͺ©μ—μ„œ μƒˆ 배열을 λ§Œλ“€κ³ μ΄ ν•­λͺ©μ— λŒ€ν•΄ μΆ”κ°€ map λ₯Ό μˆ˜ν–‰ν•˜μ—¬ μ›λž˜ λ§΅μ—μ„œ μ›λž˜ μ΅œμ’… μ½œλ°±μ„ ν˜ΈμΆœν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

이것이 μ˜λ―Έκ°€ μžˆλŠ”μ§€ ν™•μ‹€ν•˜μ§€ μ•Šμ§€λ§Œ μœ„μ—μ„œ μ„€λͺ…ν•œ 것을 λ‹¬μ„±ν•˜λŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

question

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μ•ˆλ…•ν•˜μ„Έμš” @ parky128 , 질문 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

iteratee λ₯Ό reflect λž˜ν•‘ν•΄λ„ λ κΉŒμš”? reflect 항상 callback κ²°κ³Ό 객체λ₯Ό μ „λ‹¬ν•˜λ―€λ‘œ iteratee ν•¨μˆ˜ 였λ₯˜ 쀑 ν•˜λ‚˜λΌλ„ map 이 μ’…λ£Œλ©λ‹ˆλ‹€. 그런 λ‹€μŒ map 의 results 개체λ₯Ό λ°˜λ³΅ν•˜κ³  μ–΄λ–€ κ°œμ²΄μ— error 속성이 μžˆλŠ”μ§€ ν™•μΈν•œ λ‹€μŒ μ μ ˆν•˜κ²Œ 처리 ν•  수 β€‹β€‹μžˆμŠ΅λ‹ˆλ‹€. map μˆ˜λ Ήν•˜μ§€ μ•Šμ•˜μ„ μˆ˜μžˆλŠ” ν•­λͺ©μ„ λ‹€μ‹œ 처리 ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

async.map(coll, async.reflect(function(val, callback) {
  // your request code
}, function(err, results) {
  // err will always be null now
  results.forEach(function(result, i) {
    if (result.error) {
      // your code for handling errors
      // if `coll` is an array, you could access the value that caused 
      // this error through `coll[i]` as `map` preserves the order for arrays 
    } else {
      // otherwise `result.value` will contain the result of that `iteratee` call
    }
  });
});

그렇지 μ•ŠμœΌλ©΄ μ§ˆλ¬Έμ— λ‹΅ν•˜κΈ° μœ„ν•΄ map 항상 array λ°˜ν™˜ν•©λ‹ˆλ‹€. ν•΄λ‹Ή 배열을 λ°˜λ³΅ν•˜κ³  μ–΄λ–€ 값이 undefined μžˆμŠ΅λ‹ˆλ‹€. 였λ₯˜κ°€ λ°œμƒν•˜μ—¬ undefined λ₯Ό callback μ „λ‹¬ν–ˆκ±°λ‚˜ error λ°œμƒμ‹œ 진행 μ€‘μ΄κ±°λ‚˜ μ‹œμž‘ν•˜μ§€ μ•Šμ€ ν•­λͺ©μ— ν•΄λ‹Ήν•©λ‹ˆλ‹€. reflect μ ‘κ·Ό 방식은 undefined κ°€ iteratee 호좜의 μœ νš¨ν•œ κ²°κ³Ό 일 수 μžˆμœΌλ―€λ‘œ 더 μ•ˆμ „ν•œ μ˜΅μ…˜ undefined 수 μžˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  5 λŒ“κΈ€

μ•ˆλ…•ν•˜μ„Έμš” @ parky128 , 질문 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

iteratee λ₯Ό reflect λž˜ν•‘ν•΄λ„ λ κΉŒμš”? reflect 항상 callback κ²°κ³Ό 객체λ₯Ό μ „λ‹¬ν•˜λ―€λ‘œ iteratee ν•¨μˆ˜ 였λ₯˜ 쀑 ν•˜λ‚˜λΌλ„ map 이 μ’…λ£Œλ©λ‹ˆλ‹€. 그런 λ‹€μŒ map 의 results 개체λ₯Ό λ°˜λ³΅ν•˜κ³  μ–΄λ–€ κ°œμ²΄μ— error 속성이 μžˆλŠ”μ§€ ν™•μΈν•œ λ‹€μŒ μ μ ˆν•˜κ²Œ 처리 ν•  수 β€‹β€‹μžˆμŠ΅λ‹ˆλ‹€. map μˆ˜λ Ήν•˜μ§€ μ•Šμ•˜μ„ μˆ˜μžˆλŠ” ν•­λͺ©μ„ λ‹€μ‹œ 처리 ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

async.map(coll, async.reflect(function(val, callback) {
  // your request code
}, function(err, results) {
  // err will always be null now
  results.forEach(function(result, i) {
    if (result.error) {
      // your code for handling errors
      // if `coll` is an array, you could access the value that caused 
      // this error through `coll[i]` as `map` preserves the order for arrays 
    } else {
      // otherwise `result.value` will contain the result of that `iteratee` call
    }
  });
});

그렇지 μ•ŠμœΌλ©΄ μ§ˆλ¬Έμ— λ‹΅ν•˜κΈ° μœ„ν•΄ map 항상 array λ°˜ν™˜ν•©λ‹ˆλ‹€. ν•΄λ‹Ή 배열을 λ°˜λ³΅ν•˜κ³  μ–΄λ–€ 값이 undefined μžˆμŠ΅λ‹ˆλ‹€. 였λ₯˜κ°€ λ°œμƒν•˜μ—¬ undefined λ₯Ό callback μ „λ‹¬ν–ˆκ±°λ‚˜ error λ°œμƒμ‹œ 진행 μ€‘μ΄κ±°λ‚˜ μ‹œμž‘ν•˜μ§€ μ•Šμ€ ν•­λͺ©μ— ν•΄λ‹Ήν•©λ‹ˆλ‹€. reflect μ ‘κ·Ό 방식은 undefined κ°€ iteratee 호좜의 μœ νš¨ν•œ κ²°κ³Ό 일 수 μžˆμœΌλ―€λ‘œ 더 μ•ˆμ „ν•œ μ˜΅μ…˜ undefined 수 μžˆμŠ΅λ‹ˆλ‹€.

μ‹œκ°„μ„λ‚΄μ–΄ 잠재적 인 μ†”λ£¨μ…˜μ„ μ œκ³΅ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. μ‹€μ œλ‘œ ν¬μ°©ν•˜λ €λŠ” νŠΉμ • 였λ₯˜ μ‚¬λ‘€μ—μ„œ iteratee ν•¨μˆ˜ 였λ₯˜ 쀑 ν•˜λ‚˜κ°€ λ°œμƒν•˜μžλ§ˆμž async.map μ΅œμ’… 콜백이 호좜되기λ₯Ό μ›ν•©λ‹ˆλ‹€.

λ¬Έμ„œλ₯Ό 보면 iteratee 콜백 ν•¨μˆ˜μ— 였λ₯˜λ₯Ό μ „λ‹¬ν•˜μ—¬μ΄ μž‘μ—…μ„ μˆ˜ν–‰ ν•  수 μžˆμ§€λ§Œ μ΅œμ’… μ½œλ°±μ—μ„œ async.map이 호좜 ν•  것인지, ν•΄λ‹Ή κ²°κ³Ό 객체λ₯Ό μ‚¬μš©ν•˜μ—¬ 원본과 비ꡐ할 수 μžˆλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€. μˆ˜μ§‘ν•˜κ³  처리 ν•  남은 것을 ν™•μΈν•˜μ‹­μ‹œμ˜€.

이 쀑 ν•˜λ‚˜κ°€ λ‚΄κ°€ κ΄€μ‹¬μžˆλŠ” 였λ₯˜ μΌ€μ΄μŠ€λ₯Ό λ°˜ν™˜ν•˜μžλ§ˆμž async.map이 λ‹€λ₯Έ μš”μ²­μ„ μ²˜λ¦¬ν•˜λ €κ³  μ‹œλ„ν•˜κ³  싢지 μ•ŠμŠ΅λ‹ˆλ‹€.

이 쀑 ν•˜λ‚˜κ°€ λ‚΄κ°€ κ΄€μ‹¬μžˆλŠ” 였λ₯˜ μΌ€μ΄μŠ€λ₯Ό λ°˜ν™˜ν•˜μžλ§ˆμž async.map이 λ‹€λ₯Έ μš”μ²­μ„ μ²˜λ¦¬ν•˜λ €κ³  μ‹œλ„ν•˜κ³  싢지 μ•ŠμŠ΅λ‹ˆλ‹€.

iteratee κ°€ 비동기식이라고 κ°€μ •ν•˜λ©΄ async.map λŠ” μ΅œμ’… 콜백이 호좜 될 λ•Œ λͺ¨λ“  ν•­λͺ©μ„ μ²˜λ¦¬ν•˜κΈ° μ‹œμž‘ν•©λ‹ˆλ‹€. κ²°κ³Ό 개체λ₯Ό μ»¬λ ‰μ…˜κ³Ό λΉ„κ΅ν•˜μ—¬ 아직 μ²˜λ¦¬κ°€ μ™„λ£Œλ˜μ§€ μ•Šμ€ ν•­λͺ©μ„ 확인할 수 μžˆμ§€λ§Œ 여기에도 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, κ²°κ³Ό 객체가 iteratee s ν•΄κ²°λ‘œ μ—…λ°μ΄νŠΈλ˜λ―€λ‘œ λ™μΌν•œ ν‹±μ—μ„œ μ΅œμ’… 콜백이 ν˜ΈμΆœλ˜λ―€λ‘œ 동 기적으둜 μˆ˜ν–‰ν•΄μ•Όν•©λ‹ˆλ‹€.

mapSeries μ‹œλ„ν•΄ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. mapSeries λŠ” ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μš”μ²­ 만 μ‹€ν–‰ν•©λ‹ˆλ‹€. 즉, ν˜„μž¬ ν•­λͺ©μ΄ 처리λ₯Ό μ™„λ£Œ ν•  λ•Œλ§Œ λ‹€μŒ ν•­λͺ©μ„ ν˜ΈμΆœν•©λ‹ˆλ‹€ (λͺ¨λ“  ν•­λͺ©μ„ ν•œ λ²ˆμ— μ‹œμž‘ν•˜λŠ” 것과 λ°˜λŒ€). 즉, 였λ₯˜κ°€ λ°œμƒν•˜κ³  μ΅œμ’… 콜백이 호좜되면 iteratee 더 이상 μ‹€ν–‰λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 그런 λ‹€μŒ κ²°κ³Όλ₯Ό μ»¬λ ‰μ…˜κ³Ό λΉ„κ΅ν•˜μ—¬ 아직 μ²˜λ¦¬λ˜μ§€ μ•Šμ€ ν•­λͺ©μ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. 이것은 μ—¬μ „νžˆ β€‹β€‹μ•½κ°„μ˜ ν•΄κ²° λ°©λ²•μ΄μ§€λ§Œ async.map μ‚¬μš©ν•˜λŠ” 것보닀 더 μ’‹μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œμ΄ μ ‘κ·Ό λ°©μ‹μ˜ κ°€μž₯ 큰 단점은 μš”μ²­μ΄ 더 이상 λ³‘λ ¬λ‘œ μ²˜λ¦¬λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ μ»¬λ ‰μ…˜μ΄ λ°°μ—΄ 인 경우

async.mapSeries(coll, function(val, callback) {
  // your iteratee function
}, function(err, results) {
  if (err) {
    // unprocessItems will include the item that errored.
    var unprocessItems = coll.slice(results.length - 1);
    // handle the unprocessedItems
  }
});

흠 μ’‹μ•„μš”, 예, iteratee ν•¨μˆ˜λŠ” μš”μ²­ 라이브러리λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‚˜κ°€λŠ” http μš”μ²­μ„ λ§Œλ“€κ³  κ·Έ 결과둜 μ½œλ°±ν•˜λ―€λ‘œ λΉ„λ™κΈ°μ‹μž…λ‹ˆλ‹€. λ”°λΌμ„œ 반볡 ν•  ν•­λͺ©μ΄ 10 개 μžˆλ‹€κ³  λ§ν•˜λ©΄ 4 κ°œλŠ” μ„±κ³΅ν•˜κ³  5 λ²ˆμ§ΈλŠ” μ‹€νŒ¨ν•œ λ‹€μŒ 였λ₯˜ 맀개 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ iteratee ν•¨μˆ˜μ— λŒ€ν•œ μ½œλ°±μ„ ν˜ΈμΆœν•©λ‹ˆλ‹€. μ΄λŠ” async.map에 λŒ€ν•œ μ΅œμ’… 콜백의 κ²°κ³Ό κ°œμ²΄μ— 4 개의 성곡적인 κ²°κ³Ό?

κ·Έλ ‡λ‹€λ©΄ μ§€κΈˆμ€ λͺ¨λ“  λ°œμ‹  μ „ν™”λ₯Ό κ±Έ 수 μžˆλ‹€λŠ” 사싀과 ν•¨κ»˜ μ‚΄ κ²ƒμž…λ‹ˆλ‹€. ν•„μžλŠ” μ–΄λ ˆμ΄λ₯Ό 더 μž‘μ€ μ–΄λ ˆμ΄λ‘œ λΆ„ν• ν•˜κ³  mapSeries λ‚΄μ—μ„œ 더 μž‘μ€ async.mapsλ₯Ό μˆ˜ν–‰ν•˜μ—¬ μš”μ²­μ΄ μ μ€‘ν•˜λŠ” λŒ€μƒ μ„œλ²„μ— λŒ€ν•œ 초기 적쀑을 μ΅œμ†Œν™” ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@hargasinski- κ²°κ΅­ async.reflect μ ‘κ·Ό 방식을 μ‚¬μš©ν–ˆκ³  이것은 λ‚˜λ₯Ό μœ„ν•΄ 잘 μž‘λ™ν•˜λ©° 였λ₯˜κ°€ λ°œμƒν•œ λͺ¨λ“  ν•­λͺ©μ— λŒ€ν•œ μ™„μ „ν•œ κ°€μ‹œμ„±μ„ μ œκ³΅ν•©λ‹ˆλ‹€ : +1 :

감사!

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰