๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒŒ | WEB DEV/Vanilla JS

JS_๋ฌธ๋ฒ• (5)_๋™๊ธฐ/๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

by KASSID 2022. 2. 18.

๋ชฉ์ฐจ

    728x90

    ๋™๊ธฐ์  ์ฒ˜๋ฆฌ

    ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„, ํ•ด๋‹น ์š”์ฒญ์— ์‘๋‹ต ๋ฐ›์•„ ๋‹ค์Œ ๋™์ž‘ ์‹คํ–‰

    (ํ•œ ์ค„ ์™„๋ฃŒ ํ›„ ๋‹ค์Œ ์ค„ ์ฒ˜๋ฆฌ)

    ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

    ์š”์ฒญ ๋ณด๋‚ธ ํ›„, ์‘๋‹ต์— ์ƒ๊ด€์—†์ด ๋‹ค์Œ๋™์ž‘ ์‹คํ–‰

    (ํ•œ ์ค„ ์™„๋ฃŒ ์ƒ๊ด€์—†์ด ๋‹ค์Œ ์ค„ ์ฒ˜๋ฆฌ)

     


    ๋น„๋™๊ธฐ์  ์ฒ˜๋ฆฌ?

    ๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด๋Š” ๋™๊ธฐ์  ์ฒ˜๋ฆฌ๋ฅผ ์ง€ํ–ฅํ•œ๋‹ค.

     

    JS์˜ ๊ฒฝ์šฐ์—๋Š” ์‹คํ–‰์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฉด

    ๊ธฐ๋‹ค๋ฆด ํ•„์š”์—†์ด ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ€๋„๋ก

    ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜์–ด ์žˆ๋‹ค.

     

    ์ •๋ฆฌํ•˜๋ฉด

    JS๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™๊ธฐ์  ์ฒ˜๋ฆฌ

    ์ผ๋ถ€ ๊ธฐ๋Šฅ ๋น„๋™๊ธฐ์  ์ฒ˜๋ฆฌ ์ถ”๊ฐ€ ์ œ๊ณต

     

    ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ง€์› ๊ธฐ๋Šฅ

    Rest API ์š”์ฒญ

    ํŒŒ์ผ / DB ์ฒ˜๋ฆฌ

    ํƒ€์ด๋จธ, ์•”ํ˜ธํ™” / ๋ณตํ˜ธํ™”

     

    ๋น„๋™๊ธฐ ์˜ˆ์‹œ

    setTimeout ํ•จ์ˆ˜

    setTimeout(functoin, milliseconds)

    - millisecons : ms ๋งŒํผ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ

    - function : ms๋งŒํผ ๊ธฐ๋‹ค๋ฆฐ ํ›„, ํ˜ธ์ถœํ•  ํ•จ์ˆ˜

     

    console.log("Hello")
    setTimeout(() => {console.log("My name is")}, 3000)
    console.log("Kassid")
    
    >>>
    Hello
    Kassid
    My name is

    ์œ„์˜ ์‚ฌ์ง„์„ ๋ณด๋ฉด

    2๋ฒˆ ์งธ ์ค„์ด ์‹คํ–‰์ด ๋˜๊ณ  ์™„๋ฃŒ๊ฐ€ ๋˜์ง€ ์•Š์•˜์ง€๋งŒ

    3๋ฒˆ ์งธ ์ค„์ด ์‹คํ–‰์ด ๋œ ๋ชจ์Šต๋‹ˆ๋‹ค.

     

    (2๋ฒˆ ์งธ ์ค„์ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•˜๋Š” ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ)

     

    ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฌธ์ œ์ ?

    ์˜ˆ์‹œ๋กœ

    Rest API๋ฅผ ํ˜ธ์ถœํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„์— ์š”์ฒญ์„ ํ•œ ํ›„

    ๊ทธ ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ง„ํ–‰ํ•ด์•ผํ•˜๋Š”๋ฐ

    ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋กœ ์ธํ•ด ๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰์ด ๋˜๋ฉด

    ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค..!!


    ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

    1. ์ฝœ๋ฐฑํ•จ์ˆ˜ callback

    JS๋Š” first-class function์ด๋‹ค.

    ์ฆ‰,

    ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅ ๊ฐ€๋Šฅํ•˜๊ณ 

    ํ•จ์ˆ˜์˜ ์ธ์ž์— ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

    ๋˜ํ•œ return๊ฐ’์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    function func1(callback) { //ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ
        setTimeout(()=>{
            console.log("func1")
            callback() //์ธ์ˆ˜๋กœ ๋ฐ›์•„์˜จ ํ•จ์ˆ˜ ์‹คํ–‰
        },100)
    }
    
    function func2() {
        console.log("func2")
    }
    
    func1(func2)
    
    >>>
    func1
    func2

    ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๋˜๋ฉด

    ์ฝœ๋ฐฑํ•จ์ˆ˜ ์•ˆ์— ์ฝœ๋ฐฑํ•จ์ˆ˜ ์•ˆ์— ์ฝœ๋ฐฑํ•จ์ˆ˜ ,,,,,

    ์ด๋ ‡๊ฒŒ ๊ณ„์† ๋“ค์–ด๊ฐ€์•ผํ•œ๋‹ค.

     

    2. Promise

    callbackํ•จ์ˆ˜์˜ ๋‹จ์ ์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ๋ฌธ๋ฒ•์ด๋‹ค.

    1)
    new๋กœ Promise์ƒ์„ฑ์„ํ•œ๋‹ค.

    2)
    Promise ๊ฐ์ฒด์— ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜๋Š” executor ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
    ์ด ํ•จ์ˆ˜๋Š” new Promise๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ๋•Œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๊ณ 
    resolve, reject๋ผ๋Š” ๋‘ ๊ฐœ์˜ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. 

    3)
    executor๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํ›„
    resolve, reject ํ•จ์ˆ˜ ํ˜ธ์ถœ
    (resolve : ์„ฑ๊ณต ์‹œ / reject : ์‹คํŒจ ์‹œ)

     

    then ๋ฉ”์„œ๋“œ

    ์„ฑ๊ณต, ์‹คํŒจ ์‹œ์˜ ์ˆ˜ํ–‰ ์ž‘์—… ์ •์˜ &

    promise ์ฝ”๋“œ ์‹คํ–‰

     

    promise.then(successCallback, failCallback)

     

     

     

     

    const func = new Promise(
        (resolve, reject) => { 	//์„ฑ๊ณต, ์‹คํŒจ ํ•จ์ˆ˜์ธ์ˆ˜๋กœ ๋ฐ›๊ธฐ
            setTimeout(() => { 	//๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์‹คํ–‰
                let num = 10	
                if (num > 9) {	
                    resolve(num)	//successCallback
                } else {
                    reject("error")	//failCallback
                }
            }, 1000);
        }
    )
    
    func.then((item) => { 	//successCallback
        console.log('success', item)    
    }, (err) => {		//failCallback
        console.log(err)
    })
    
    >>>
    success 10

     

    ๋งŒ์•ฝ then ๋ฉ”์„œ๋“œ์— ํ•˜๋‚˜๋งŒ ์„ ์–ธํ•œ๋‹ค๋ฉด

    successCallback ๋™์ž‘๋งŒ ์„ ์–ธํ•œ ์…ˆ์ด๋‹ค.

    func.then((item) => { 	//successCallback
        console.log('success', item)    
    })

    ๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๋ฒ”์œ„๋Š”

    Promise์— ์ „๋‹ฌ๋œ ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ๋งŒ ์ด๋‹ค.

     

     

    const func = new Promise(
        (resolve, reject) => { 	//์„ฑ๊ณต, ์‹คํŒจ ํ•จ์ˆ˜์ธ์ˆ˜๋กœ ๋ฐ›๊ธฐ
            setTimeout(() => { 	//๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์‹คํ–‰
                let num = 10	
                if (num > 9) {	
                    resolve(num)	//successCallback
                } else {
                    reject("error")	//failCallback
                }
            }, 1000);
        }
    )
    
    func.then((item) => { 	//successCallback
        console.log('success', item)    
    }, (err) => {		//failCallback
        console.log(err)
    })
    console.log("Hello")
    
    >>>
    Hello
    success 10

    ๋”ฐ๋ผ์„œ ์œ„์˜ ์˜ˆ์‹œ์—์„œ

    Hello๊ฐ€ ๋จผ์ € ์ถœ๋ ฅ์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

     

    ๋งŒ์•ฝ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ณ„์†ํ•ด์„œ ์ด์–ด์ ธ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

    ์•„๋ž˜์™€ ๊ฐ™์ด

    .then์„ ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค.

     

     

    const func = new Promise(
        (resolve, reject) => { 	//์„ฑ๊ณต, ์‹คํŒจ ํ•จ์ˆ˜์ธ์ˆ˜๋กœ ๋ฐ›๊ธฐ
            setTimeout(() => { 	//๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์‹คํ–‰
                let num = 10	
                if (num > 9) {	
                    resolve(num)	//successCallback
                } else {
                    reject("error")	//failCallback
                }
            }, 1000);
        }
    )
    
    func.then((item) => { 	//successCallback
        console.log('success', item)    
    }, (err) => {		//failCallback
        console.log(err)
    }).then(()=>{
        console.log("Hello")
    })
    
    
    >>>
    success 10
    Hello

     

    ์ •๋ฆฌํ•˜๋ฉด

    ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์ค‘๊ฐ„์— ์žˆ๊ณ ,

    ์ด ํ•จ์ˆ˜๊ฐ€ ๋๋‚œ ๋’ค์— 

    ์ด์–ด์ ธ์•ผ ํ•˜๋Š” ์ฝ”๋“œ๋“ค์˜ ๊ฒฝ์šฐ์—๋Š”

    Promise๋ฅผ ์ด์šฉํ•ด์„œ

    ์ˆœ์„œ ๊ด€๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

     

    ๋Œ“๊ธ€