함수내 비동기 제어

soob·2020년 8월 2일
0

함수형프로그래밍

목록 보기
7/8
  • 그냥 reduce
const reduce = (f, acc, iter)=>{
	// 초기값 없을 경우
	if(!iter){
    	iter = acc[Symbol.iterator]();
        acc = iter.next().value;
    }else{
    	iter = iter[Symbol.iterator]();
    }
    let cur;
    while(!(cur= iter.next()).done){
    	const a = cur.value;
        acc = f(acc, a);
    }
    
}
  • 비동기 제어를 포함한 reduce1 (acc가 비동기값이 된 후에는 계속 비동기를 처리하는 메소드가 체이닝 될 경우에만 동작 , 불안정하다.)
const reduce = (f, acc, iter)=>{
	if(!iter){
    	iter = acc[Symbol.iterator]();
        acc = iter.next().value;
    }else{
    	iter = iter[Symbol.iterator]();
    }
    let cur;
    while(!(cur= iter.next()).done){
    	const a = cur.value;
        //acc = f(acc, a);
        acc = acc instanceOf Promise ? acc.then(acc => f(acc, a)) : f(acc, a);
    }
    return acc;
}
  • 비동기 제어를 포함한 reduce2
const go1 = (a, f) => a instanceOf Promise ? a.then(f): f(a)

const reduce = (f, acc, iter)=>{
	if(!iter){
    	iter = acc[Symbol.iterator]();
        acc = iter.next().value;
    }else{
    	iter = iter[Symbol.iterator]();
    }
    //첫 번째 acc가 promise일 경우를 처리하기위해 , go1 사용
    return function go1(acc, recur(acc){
    	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;
    })
profile
쓸데없는 소리를 좋아하는 개발자

0개의 댓글