3-6. 코드를 컬렉션으로 다루기 2 - series, concurrency
— Functional programming — 1 min read
프로그래머스에서 진행한 유인동님의 ES6로 알아보는 동시성 & 함수형 프로그래밍 강의를 들으며 정리한 내용입니다.
# find계열 함수 동시성 지원하도록 리팩토링
findValC()
를 부모함수로 활용- 인자에 limit 추가
1var findC = curry((f, coll, limit) => findValC((a) => go(a, f, (bool) => (bool ? a : undefined)), coll, limit));2
3var noneC = curry((f, coll, limit) => go(findC(f, coll, limit), isUndefined));4
5var someC = curry((f, coll, limit) => go(noneC(f, coll, limit), not));6
7var everyC = curry((f, coll, limit) => go(findC(negate(f), coll, limit), isUndefined));
# series()
, concurrency()
map계열함수. 함수세트를 배열로 집어넣었을 때,
- series - 각 함수를 순차적으로 수행하여, 반환값을 배열로 뽑아주는 함수
- concurrency - 각 함수를 병렬적으로 수행하여, 반환값을 배열로 뽑아주는 함수
1// time(v): 값(v)를 반환하는데 2초가 걸리는 함수2
3const series = map((f) => f());4const concurrency = mapC((f) => f());5
6go(series([(_) => Promise.resolve(100), (_) => 200, (_) => Promise.resolve(300)]), log); // [100, 200, 300] -> 6초 소요7
8go(concurrency([(_) => Promise.resolve(100), (_) => 200, (_) => Promise.resolve(300)]), log); // [100, 200, 300] -> 2초 소요
ex) 서버통신에 유용함
- 전혀 다른 쿼리를 서버에 날려, 이를 병렬적으로 처리해 데이터를 받아오고 (성능 good)
- 데이터를 다 받아오면
- 받아온 데이터를 html함수로 브라우저에 그려준다
1go(2 concurrency({3 // -> 14 user: (_) => Promise.resolve(["user1", "user2"]),5 post: (_) => Promise.resolve(["post1", "post2"]),6 }), // -> 2 {user: [u1,u2], post: [p1,p2]}7 html8); // -> 3
# concurrency vs async-await
concurrency가 async-await로 코드를 짜는 것보다 우월한 이유
- 표현력이 훨씬 좋아진다. async-await로 짜면 행사코드가 많아짐
- baseMF에 다형성을 추가하면, 다양한 형태의 데이터 타입을 지원할 수 있다
1// async-await 버전2go(3 (async () => {4 const [users, posts] = await Promise.all([await time(["user1", "user2"]), await time(["post1", "post2"])]);5 return {6 users,7 posts,8 };9 })(),10 log11);