ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JS] chapter19. ๋น„๋™๊ธฐ1 - java script
    codeStates front-end/Java Script 2023. 1. 17. 15:52
    ๋ฐ˜์‘ํ˜•

     

     

     

     

     

     

     

    ๐Ÿ“Œ ๋น„๋™๊ธฐ

     

     

    - ๋™๊ธฐ(synchronous)

    ๋™๊ธฐ ์ฒ˜๋ฆฌ๋ž€, ํŠน์ • ์ฝ”๋“œ์˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ๋‚œ ํ›„ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ

     

    - ๋น„๋™๊ธฐ(asynchronous)

    ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ž€, ํŠน์ • ์ฝ”๋“œ์˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ

    js๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜ ๋™์ž‘ ์–ธ์–ด๋ผ์„œ ๋™๊ธฐ์  ์ž‘๋™์ด์ง€๋งŒ ํ™˜๊ฒฝ(๋Ÿฐํƒ€์ž„)์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๋„์™€์ฃผ๊ธฐ ๋•Œ๋ฌธ์—

    ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋˜ํ•œ ๊ฐ€๋Šฅํ•˜๋‹ค.

    ๋น„๋™๊ธฐ๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์ž!

     

     

     

     

    โฑ ํƒ€์ด๋จธ ๊ด€๋ จ API

    ๋น„๋™๊ธฐ ์ฒซ๋ฒˆ์งธ ๋‹จ๊ณ„ ํƒ€์ด๋จธ ๊ด€๋ จ API

     

     

     

    setTimeout(callback, millisecond)

     

    ์ผ์ • ์‹œ๊ฐ„ ํ›„์— ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰

     

    • ๋งค๊ฐœ๋ณ€์ˆ˜(parameter): ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜, ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์‹คํ–‰ ์ „ ๊ธฐ๋‹ค๋ ค์•ผ ํ•  ์‹œ๊ฐ„ (๋ฐ€๋ฆฌ์ดˆ)
    • return ๊ฐ’: ์ž„์˜์˜ ํƒ€์ด๋จธ ID
    setTimeout(function () {
      console.log('1์ดˆ ํ›„ ์‹คํ–‰');
    }, 1000);
    // 123

     

     

    clearTimeout(timerId)

     

    setTimeout ํƒ€์ด๋จธ๋ฅผ ์ข…๋ฃŒ

     

    • ๋งค๊ฐœ๋ณ€์ˆ˜(parameter): ํƒ€์ด๋จธ ID
    • return ๊ฐ’: ์—†์Œ
    const timer = setTimeout(function () {
      console.log('10์ดˆ ํ›„ ์‹คํ–‰');
    }, 10000);
    clearTimeout(timer);
    // setTimeout์ด ์ข…๋ฃŒ๋จ.

     

    setInterval(callback, millisecond)

     

    ์ผ์ • ์‹œ๊ฐ„์˜ ๊ฐ„๊ฒฉ์„ ๊ฐ€์ง€๊ณ  ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‹คํ–‰

    • ๋งค๊ฐœ๋ณ€์ˆ˜(parameter): ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜, ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ (๋ฐ€๋ฆฌ์ดˆ)
    • return ๊ฐ’: ์ž„์˜์˜ ํƒ€์ด๋จธ ID
    
    setInterval(function () {
      console.log('1์ดˆ๋งˆ๋‹ค ์‹คํ–‰');
    }, 1000);
    // 345

     

    clearInterval(timerId)

     

    setInterval ํƒ€์ด๋จธ๋ฅผ ์ข…๋ฃŒ

    • ๋งค๊ฐœ๋ณ€์ˆ˜: ํƒ€์ด๋จธ ID
    • return ๊ฐ’: ์—†์Œ
    
    const timer = setInterval(function () {
      console.log('1์ดˆ๋งˆ๋‹ค ์‹คํ–‰');
    }, 1000);
    clearInterval(timer);
    // setInterval์ด ์ข…๋ฃŒ๋จ.

     

     

     

     

    ๋น„๋™๊ธฐ๋กœ ์ž‘๋™ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•1 - ์ฝœ๋ฐฑํ•จ์ˆ˜

     

     

    ์ œ์–ดํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ

     

    // ํ„ฐ๋ฏธ๋„์— `node index.js`๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ์ˆœ์„œ๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š”.
    const printString = (string) => {
      setTimeout(function () {
        console.log(string);
      }, Math.floor(Math.random() * 100) + 1);
    };
    
    const printAll = () => {
      printString('A');
      printString('B');
      printString('C');
    };
    
    printAll();
    
    console.log(`์•„๋ž˜์™€ ๊ฐ™์ด ๋น„๋™๊ธฐ ์ฝ”๋“œ๋Š” ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!`);

     

     

    ์ œ์–ด๋œ ์ฝ”๋“œ

     

    ์ฃผ์˜์‚ฌํ•ญ

     

    ๐Ÿ“ ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ๋ณต์žกํ•  ์ˆ˜๋ก ๊ฐ€๋…์„ฑ์˜ ๋‚ฎ์•„์ง€๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

     

    // ํ„ฐ๋ฏธ๋„์— `node index.js`๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ์ˆœ์„œ๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š”.
    const printString = (string, callback) => {
      setTimeout(function () {
        console.log(string);
        callback(); // ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค
      }, Math.floor(Math.random() * 100) + 1);
    };
    
    const printAll = () => {
      printString('A', () => {
        printString('B', () => {
          printString('C', () => {});
        });
      });
    };
    
    printAll();
    
    console.log(
      `์•„๋ž˜์™€ ๊ฐ™์ด Callback ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ฝ”๋“œ์˜ ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!`
    );

     

     

    ๋น„๋™๊ธฐ๋กœ ์ž‘๋™ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•2 - Promise

     

    new Promise

     

    Promise๋Š” class์ด๊ธฐ ๋•Œ๋ฌธ์— new ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด Promise ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ

    ๋˜ํ•œ Promise๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜(executor)๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋ฐ

    ์ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” resolve, reject ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ

     

    promise ๊ฐ์ฒด ์ƒ์„ฑ -> resolve ํ•จ์ˆ˜ ํ˜ธ์ถœ -> ์—๋Ÿฌ ๋ฐœ์ƒ ๊ฒฝ์šฐ reject ํ•จ์ˆ˜ ํ˜ธ์ถœ

     

    let promise = new Promise((resolve, reject) => {
    	// 1. ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒฝ์šฐ
    	// resolve์˜ ์ธ์ž์— ๊ฐ’์„ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
    	resolve(value);
    
    	// 2. ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ
    	// reject์˜ ์ธ์ž์— ์—๋Ÿฌ๋ฉ”์„ธ์ง€๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
    	reject(error);
    });

     

    promise ๊ฐ์ฒด ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ

     

    state : ๋Œ€๊ธฐ

    result : undefined -> value -> error

    then : .then ๋ฉ”์„œ๋“œ ์ ‘๊ทผ

     

    let promise = new Promise((resolve, reject) => {
    	resolve("์„ฑ๊ณต");
    });
    
    promise.then(value => {
    	console.log(value);
    	// "์„ฑ๊ณต"
    })

     

    catch : ์—๋Ÿฌ ๋ฐœ์ƒ์‹œ reject ํ•จ์ˆ˜ ํ˜ธ์ถœ

     

    let promise = new Promise(function(resolve, reject) {
    	reject(new Error("์—๋Ÿฌ"))
    });
    
    promise.catch(error => {
    	console.log(error);
    	// Error: ์—๋Ÿฌ
    })

     

    finally : ์ •์ƒ ์ฒ˜๋ฆฌ ์—ฌ๋ถ€ ๊ด€๊ณ„ ์—†์ด finally๋ฉ”์„œ๋“œ๋กœ ์ ‘๊ทผ

     

    let promise = new Promise(function(resolve, reject) {
    	resolve("์„ฑ๊ณต");
    });
    
    promise
    .then(value => {
    	console.log(value);
    	// "์„ฑ๊ณต"
    })
    .catch(error => {
    	console.log(error);
    })
    .finally(() => {
    	console.log("์„ฑ๊ณต์ด๋“  ์‹คํŒจ๋“  ์ž‘๋™!");
    	// "์„ฑ๊ณต์ด๋“  ์‹คํŒจ๋“  ์ž‘๋™!"
    })

     

    Promise chaining

     

    Promise chaining๊ฐ€ ํ•„์š”ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

    Promise chaining์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” .then, .catch, .finally ์˜ ๋ฉ”์„œ๋“œ๋“ค์€ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ

    .then์„ ํ†ตํ•ด ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๊ณ , ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ .catch ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋œ๋‹ค

     

    let promise = new Promise(function(resolve, reject) {
    	resolve('์„ฑ๊ณต');
    	...
    });
    
    promise
      .then((value) => {
        console.log(value);
        return '์„ฑ๊ณต';
      })
      .then((value) => {
        console.log(value);
        return '์„ฑ๊ณต';
      })
      .then((value) => {
        console.log(value);
        return '์„ฑ๊ณต';
      })
      .catch((error) => {
        console.log(error);
        return '์‹คํŒจ';
      })
      .finally(() => {
        console.log('์„ฑ๊ณต์ด๋“  ์‹คํŒจ๋“  ์ž‘๋™!');
      });

     

    Promise.all

     

    Promise.all()์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„๋•Œ ์‚ฌ์šฉ

     

    const promiseOne = () => new Promise((resolve, reject) => setTimeout(() => resolve('1์ดˆ'), 1000));
    const promiseTwo = () => new Promise((resolve, reject) => setTimeout(() => resolve('2์ดˆ'), 2000));
    const promiseThree = () => new Promise((resolve, reject) => setTimeout(() => resolve('3์ดˆ'), 3000));

     

    ๊ธฐ์กด Promise chaining์„ promise.all๋กœ๋„ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ

     

    // promise.all
    Promise.all([promiseOne(), promiseTwo(), promiseThree()])
      .then((value) => console.log(value))
      // ['1์ดˆ', '2์ดˆ', '3์ดˆ']
      .catch((err) => console.log(err));

     

    + Promise.all()์€ ํ•˜๋‚˜๋ผ๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ ํ•˜๋ฉด ์ฆ‰์‹œ ์ข…๋ฃŒ

    ex) 1์ดˆ ํ›„์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  error:1์ด ๋ฐ˜ํ™˜๋œ ํ›„๋กœ๋Š” ์ž‘๋™ x

     

    Promise.all([
    	new Promise((resolve, reject) => setTimeout(() => reject(new Error('์—๋Ÿฌ1'))), 1000),
    	new Promise((resolve, reject) => setTimeout(() => reject(new Error('์—๋Ÿฌ2'))), 2000),
    	new Promise((resolve, reject) => setTimeout(() => reject(new Error('์—๋Ÿฌ3'))), 3000),
    ])
    	.then((value) => console.log(value))
      .catch((err) => console.log(err));
    	// Error: ์—๋Ÿฌ1

     

     

    Promise Hell

     

    Promise๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ฝ”๋“œ์˜ ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Callback ํ•จ์ˆ˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์งˆ์ˆ˜๋ก ๋ณต์žกํ•ด์ง€๊ณ 

    ๊ฐ€๋…์„ฑ์ด ๋‚ฎ์•„์ง€๋Š” Promise Hell์ด ๋ฐœ์ƒํ•˜๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค

     

    const printString = (string) => {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve(string);
        }, Math.floor(Math.random() * 100) + 1);
      });
    };
    
    const printAll = () => {
      printString('A').then((value) => {
        console.log(value);
    
        printString('B').then((value) => {
          console.log(value);

     

     

     

     

     

    ๐Ÿช„ Async/Await (์ค‘์š”)

     

    ๋ณต์žกํ•œ promise ์ฝ”๋“œ ๋Œ€์‹  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑ ๊ฐ€๋Šฅ

    ํ•จ์ˆ˜ ์•ˆ์— async ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  async ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉ

     

     

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€

Designed by Tistory.