promise.all => 최종적으로 기다렸다가 한번만 반환
function a(){
    return new Promise(resolve => {
        setTimeout(() => {
            resolve('A') //이행
        }, 1000)
    })
}
function b(){
    return new Promise(resolve => {
        setTimeout(() => {
            resolve('B') //이행
        }, 2000)
    })
}
;(async () => {
    
    const res = await Promise.all([a(), b()])
    console.log(res)
})()Promise.race => 선착순. 제일 먼저 온 값만 반환
function a(){
    return new Promise(resolve => {
        setTimeout(() => {
            resolve('A') //이행
        }, 1000)
    })
}
function b(){
    return new Promise(resolve => {
        setTimeout(() => {
            resolve('B') //이행
        }, 2000)
    })
}
function c(){
    return new Promise(resolve => {
        setTimeout(() => {
            resolve('C') //이행
        }, 3000)
    })
}
;(async () => {
    const res = await Promise.race([a(), b(), c()])
    console.log(res)
})()forEach는 비동기를 순서대로 돌릴수가 없음. 한번에 팍뜸!
function a(){
    return new Promise(resolve => {
        setTimeout(() => {
            resolve('A')
        }, 1000)
    })
}
function b(){
    return new Promise(resolve => {
        setTimeout(() => {
            resolve('B')
        }, 1000)
    })
}
function c(){
    return new Promise(resolve => {
        setTimeout(() => {
            resolve('C')
        }, 1000)
    })
}
const arr = [a, b, c]
arr.forEach(async item => {
    console.log(await item())
})for 반복문은 비동기를 순서대로 돌릴 수 있음
function a(){
    return new Promise(resolve => {
        setTimeout(() => {
            resolve('A')
        }, 1000)
    })
}
function b(){
    return new Promise(resolve => {
        setTimeout(() => {
            resolve('B')
        }, 1000)
    })
}
function c(){
    return new Promise(resolve => {
        setTimeout(() => {
            resolve('C')
        }, 1000)
    })
}
;(async () => {
    const arr = [a, b, c]
    for( let i = 0; i< arr.length; i += 1){
        console.log(await arr[i]())
    }
})()for => 기본
for in => 객체
for of => 배열