[javascript] async.waterfall과 async.series의 차이점은 무엇입니까?

nodejs 비동기 모듈 : https://github.com/caolan/async 는 두 가지 유사한 방법을 제공 async.waterfall하며 async.series.

그들 사이의 차이점은 무엇입니까?



답변

async.waterfall각 함수는 결과를 다음 함수에 async.series전달하고 모든 결과는 최종 콜백 에 전달하는 것으로 보입니다 . 더 높은 수준에서는 async.waterfall데이터 파이프 라인 ( “주어진 2, 3을 곱하고 2를 더하고 17로 나누기”)을 async.series위한 반면 , 순서대로 수행해야하지만 그렇지 않으면 별 개인 개별 작업을위한 것입니다.


답변

두 함수 모두 모든 함수의 반환 값을 다음 함수로 전달한 다음 완료되면 메인 콜백을 호출하고 오류가 발생하면 해당 오류를 전달합니다.

차이점은 async.series()시리즈가 완료되면 모든 결과를 기본 콜백에 전달한다는 것입니다. async.waterfall()마지막으로 호출 된 함수의 결과 만 메인 콜백에 전달합니다.


답변

async.waterfall()에 대해 다루고 있습니다 action that relies on the previous outcome.

async.series() 원하는 행동을 다루고 있습니다. see all the result at the end


답변

async.waterfall은 한 번 작성된 리팩토링이 어렵고 더 많은 인수를 제공하면 다른 함수가 서명을 많이 변경하기 때문에 오류가 발생하기 쉬우므로 유해하다고 생각합니다.

async.autoInjectasync.waterfall의 훌륭한 대안으로 적극 권장 합니다.
https://caolan.github.io/async/autoInject.js.html

async.waterfall을 사용하기로 선택한 경우 모든 것을 하나의 객체에 저장하는 것이 좋습니다. 따라서 함수가 다음과 같이 길이 / 서명을 변경할 필요가 없습니다.

경고 : 이것은 잘못된 패턴입니다.

async.waterfall([
  cb => {
    cb(null, "one", "two");
  },
  (one, two, cb) => {
    cb(null, 1, 2, 3, 4);
  },
  (one,two,three,four,cb) => {
     // ...
  }
])

위의 방법으로하지 마십시오. 이것은 사용 하기에 훨씬 더 나은 패턴입니다 .

async.waterfall([
  cb => {
    cb(null, {one:"one", two:"two"});
  },
  (v, cb) => {
    cb(null, [1, 2, 3, 4]);
  },
  (v,cb) => {
     // ...
  }
])

이렇게하면 함수 인수의 길이가 올바른지 확인하려고 머리를 뽑지 않을 것입니다. 첫 번째 함수는 하나의 arg-콜백 만 허용합니다. 나머지 모든 인수는 값과 콜백이라는 두 개의 인수를 받아야합니다. 패턴을 고수하면 제정신이 유지됩니다!


답변