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


답변:


168

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


이 두 함수 중 하나가 값을 반환 할 수 있습니까? 가능하다는 것을 읽었지만 문서에서 관련 정보를 찾을 수 없습니다.
Anderson Green

1
@AndersonGreen : 아니요. 라이브러리 소스를 보면 값 waterfallseries반환 되지 않습니다 . 결과가 무엇이든 선택적인 콜백 매개 변수에 사용될 것으로 예상됩니다.
Twisol 2009 년

위의 답변은 2012 년까지 정확할 수 있지만 올바른 답변은 다음과 동일합니다. series ()는 모든 결과가 Final 콜백에 전달되고 폭포가 마지막으로 전달 된 결과라고 명명 되었기 때문에 다음과 같습니다. 최종 콜백. 참조 모질라 개발자
Jeb50

53

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

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


1
이 대답 ;-)해야한다
스튜어트 앨런

@Mario "두 함수 모두 이전 함수의 콜백을 전달합니다."OR "두 함수 모두 이전 함수의 결과를 전달합니다."?
user1451111

@ user1451111은 결과, 롤 ... 나는 확실히 내가 쓴하고 그 ...하지만 처음

26

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

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


1
멋지게 생성 된 이미지. 직접 만들었나요, 아니면 다른 곳에서 가져 왔나요?
user1451111

당신은 대답에 그림을 넣어야합니다, 사람들은 아마 그들을 놓칠 것입니다 o / w
Alexander Mills

1

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-콜백 만 허용합니다. 나머지 모든 인수는 값과 콜백이라는 두 개의 인수를 받아야합니다. 패턴을 고수하면 제정신이 유지됩니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.