Promise, async, await, Generator


[ Promise ]

const pr = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve('ok') 
        reject(new Error('error'))
    }, 3000)
});

pr.then(
    function(result) {
        console.log(result + '가지러 가자');
    },
    function(err) {
        console.log(err + '다시 주문해주세요');
    }
);

console.log("시작")
pr.then(
    (result) => {
        console.log(result + '가지러 가자');
    }).catch(
        (err) => {
            console.log(err + '다시 주문해주세요');      
    }).finally(
        () => {
            console.log('---주문 끝---')
        }
    )
console.log('test');


[ Promise.all ]

모든 호출이 끝나야 끝난다.

const f1 = () => {
    return new Promise((res, rej) => {
        setTimeout(() => {
            res("1번 주문 완료");
        }, 1000);
    });
};

const f2 = () => {
    return new Promise((res, rej) => {
        setTimeout(() => {
            res("2번 주문 완료");
        }, 3000);
    });
};

const f3 = () => {
    return new Promise((res, rej) => {
        setTimeout(() => {
            res("3번 주문 완료");
        }, 2000);
    });
};

Promise.all([f1(), f2(), f3()]).then((res) => {
    console.log(res);
});


[ Promise.race ]

하나라도 완료되면 끝낸다.

Promise.race([f1(), f2(), f3()]).then((res) => {
    console.log(res);
});


[ async ]

async function getName() {
    // return "Mike";
    // return Promise.resolve("Tom")
    throw new Error("err...")
}

// console.log(getName());

getName().then((name) => {
    console.log(name);
}).catch((err) => {
    console.log(err)
}) 


[ await ]

async 내부에서만 사용가능하다.

function getName(name) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(name);
        }, 1000);
    });
};

async function showName() {
    const result = await getName("Mike");
    console.log(result);
};

console.log("시작");
showName();


const f1 = () => {
    return new Promise((res, rej) => {
        setTimeout(() => {
            res("1번 주문 완료");
        }, 1000);
    });
};

const f2 = (message) => {
    console.log(message);
    return new Promise((res, rej) => {
        setTimeout(() => {
            res("2번 주문 완료");
            // rej( new Error("ERRRRRRRR"));
        }, 3000);
    });
};

const f3 = (message) => {
    console.log(message);
    return new Promise((res, rej) => {
        setTimeout(() => {
            res("3번 주문 완료");
        }, 2000);
    });
};
console.log("시작");
async function order() {

    try {
        const result1 = await f1();
        const result2 = await f2(result1);
        const result3 = await f3(result2);
        console.log(result3);
    } catch (e) {
        console.log(e);
    }
    console.log("종료");
};

console.log("시작");
async function order() {

    try {
        const result = await Promise.all([f1(), f2(), f3()]);
        console.log(result);
    } catch (e) {
        console.log(e);
    }
    console.log("종료");
};
order();


[ Generator ]

함수의 실행을 중간에 멈췄다가 재개할 수 있는 기능

function* fn() {
    console.log(1);
    yield 1;
    console.log(2);
    yield 2;
    console.log(3);
    console.log(4);
    yield 3;
    return "finish";
}

const a = fn();