nodejs 비동기 모듈 : https://github.com/caolan/async 는 두 가지 유사한 방법을 제공 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
위한 반면 , 순서대로 수행해야하지만 그렇지 않으면 별 개인 개별 작업을위한 것입니다.
waterfall
도 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.autoInject
async.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-콜백 만 허용합니다. 나머지 모든 인수는 값과 콜백이라는 두 개의 인수를 받아야합니다. 패턴을 고수하면 제정신이 유지됩니다!