MDN:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

function runInDelay(seconds) {
   return new Promise((resolve, reject) => {
    if(!seconds || seconds <0){
        reject(new Error('seconds가 0보다 작음'));
    }
    setTimeout(resolve, seconds*1000);
   });
}

runInDelay()
    .then(() => console.log('타이머 완료!'))
    .catch(console.error)
    .finally(() => console.log('끝났다!'));
function runInDelay(callback, seconds) {
    if(!callback) {
        throw new Error('callback함수를 전달 해야 함');
    }
    if(!seconds || seconds < 0) {
        throw new Error('seconds는 0보다 커야 함');
    }
    setTimeout(callback, seconds*1000);
}

try{
    runInDelay(() => {
        console.log('타이머 완료!');
    }, 2);
} catch (error) {}
console.clear();
function fetchEgg(chicken){
    return Promise.resolve(`${chicken} => 🐣`);
}

function fryEgg(egg){
    return Promise.resolve(`${egg} => 🍥`);
}

function getChicken(){
    return Promise.reject(new Error('치킨을 가지고 올 수 없음!'));
    //return Promise.resolve(`🎍 =>🐓`);
}

getChicken()
    .catch(() => '🐓')  // 🐓 => 🐣 => 🍥
    .then(fetchEgg)
    .then(fryEgg)
    .then(console.log); // 🎍 =>🐓 => 🐣 => 🍥
function getBanana() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve('🍌');
        }, 1000);
    });
}

function getApple() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve('🍎');
        }, 3000);
    });
}

function getOrange() {
    return Promise.reject(new Error('no orange'));
}

// 바나나와 사과를 같이 가져오기
getBanana()//
    .then(banana => 
        getApple()//
        .then((apple) => [banana, apple])
).then(console.log);

// Promise.all 병렬적으로 한번에 모든 Promise들을 실행!
Promise.all([getBanana(), getApple()]) //
        .then((fruits) => console.log('all', fruits));

// Promise.race 주어진 Promise 중에 제일 빨리 수행되는 것이 이김!
Promise.race([getBanana(), getApple()]) //
.then(fruits => console.log('race', fruits));

Promise.all([getBanana(), getApple(), getOrange()]) //
        .then((fruits) => console.log('all', fruits))
        .catch(console.log); // Error: no orange

Promise.allSettled([getBanana(), getApple(), getOrange()]) //
    .then((fruits) => console.log('all', fruits))
    .catch(console.log); //  { status: 'fulfilled', value: '🍌' },     { status: 'fulfilled', value: '🍎' }, {status: 'rejected', reason: Error: no orange at getOrange