작성
·
318
0
reduce 함수를 아래와 같이 수정하고 go함수를 실행시킬 경우 acc를 acc = acc instanceof Promise ? acc.then(acc => f(acc, a)):f(acc, a);로 작성한 구현보다 성능상 이점이 있다고 하셨는데 어떤 점에서 그런지 좀 더 자세히 설명해주실 수 있을까요? 특히 콜스택과 관련해서 어떤 차이가 있는지 잘 이해가 안 되네요. Promise에서 then은 매번 새로운 콜스택을 사용하면서 추가적인 로드가 발생하는 것인가요? 재귀함수를 호출하면서 생기는 약간의 추가 로드도 있을 것 같은데, then에서의 콜스택 사용과 비교했을 때에 성능상 이점이 크기 때문에 이렇게 구현해서 사용하는 것인가요? go, pipe, reduce에서 비동기제어편 약 5분 45초 이후에 설명된 부분입니다.
const reduce = curry((f, acc, iter) => {
if (!iter) {
iter = acc[Symbol.iterator]();
acc = iter.next().value;
} else {
iter = iter[Symbol.iterator]();
}
return (function recur() {
let cur;
while (!(cur = iter.next()).done) {
const a = cur.value;
acc = f(acc, a);
if (acc instanceof Promise) {
return acc.then(recur);
}
}
return acc;
})(acc);
});
go(
1,
(a) => a + 10,
(a) => Promise.resolve(a + 100),
(a) => a + 1000,
console.log
);
답변 4
2
for문 만으로 처리하면 모든 함수 마다 promise에 감싸져서 매번 비동기가 일어납니다.
반면에 후자의 기법을 쓰면 f 가 연속으로 동기인 상황에서는 같은 콜스택에서 반복문안에서 실행되고 비동기가 매번 일어나지 않기 때문에 효율적입니다.
(매번 recur 가 실행되는 것이 아닌 비동기가 있을때만 실행되고 그때만 promise를 만들게 됩니다.)
감사합니다 :)
1
안녕하세요. 답글과 코드들을 보면서 생각을 해 봤습니다.
유명함수를 사용하기 이전 코드에서는 프로미스 체인이 유지되면서 이벤트 루프가 비동기 큐에 계속해서 머무르면서 성능저하가 일어나기 때문에 유명함수를 사용하여 `비동기 처리가 필요한 시점`에서만 비동기 처리를 하는 것으로 이해를 했는데 설명하신 의도와 맞는 방향일까요??
0
0
저도 이 부분에 대해서 질문이 있는데요...
Promise 에 감싸져서 매번 비동기가 일어난다고 하셨잖아요. 그런데 Promise는 단지 비동기상황을 컨트롤 하기위한 객체아닌가요?? 비동기적인 상황은 Promise(({.... 비동기 상황}) 이렇게 Promise 안에있는 코드가 비동기적인 상황을 만드는거 아닌가요??
잘 기억은 않나지만..
return new Promise(function (resolve, reject) {
$.ajax(....)
})
이런 방식으로 사용되는 코드를 봐서요..
답변 해주시면 감사하겠습니다.
네 맞습니다. :)