[Front-end๐Ÿฆ] #29 ๋น„๋™๊ธฐ ์ฒซ๊ฑธ์Œ Promise, fetch, async, await / 19์žฅ

๋˜์ƒยท2021๋…„ 12์›” 8์ผ
1

front-end

๋ชฉ๋ก ๋ณด๊ธฐ
43/58
post-thumbnail

1. ๋ฉ‹์‚ฌ ์ˆ˜์—…

overriding, overloading

  • overriding - ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†๋ฐ›์•„์„œ ๊ฐ™์€ ์ด๋ฆ„์˜ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ.
  • overloading - ์ด๋ฆ„์ด ๊ฐ™์€ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐœ์ˆ˜/ํƒ€์ž…์ด ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๋ฉด ๋‹ค๋ฅธ ํ•จ์ˆ˜๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ. (js์—๋Š” ์—†๋Š” ๊ฐœ๋…. ๋’ค์— ๋งŒ๋“ ๊ฑธ๋กœ ๋ฎ์–ด์“ฐ๊ธฐ ๋จ.)

๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น

// ์ž”๊ณ , [์ด๋ฆ„, ์„ฑ]์„ ์š”์†Œ๋กœ ๊ฐ€์ง„ ๋ฐฐ์—ด
let arr = [1000, ["Hojun", "Lee"]]
// ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น์„ ์ด์šฉํ•ด
// ๊ณ„์ขŒ์ž”๊ณ ์—๋Š” arr[0]
// firstName์—” arr[1][0]์„
// surname์—” arr[1][1]์„ ํ• ๋‹น
let [๊ณ„์ขŒ์ž”๊ณ , [firstName, surname]] = arr;

error handling

let json = "{ bad json }";
try {
  let user = JSON.parse(json); // <-- ์—ฌ๊ธฐ์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ
  alert( user.name ); // ์ด ์ฝ”๋“œ๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
} catch (e) {
  // ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ œ์–ด ํ๋ฆ„์ด catch ๋ฌธ์œผ๋กœ ๋„˜์–ด์˜ต๋‹ˆ๋‹ค.
  alert( "๋ฐ์ดํ„ฐ์— ์—๋Ÿฌ๊ฐ€ ์žˆ์–ด ์žฌ์š”์ฒญ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค." );
  alert( e.name );
  alert( e.message );
}
try {
  alert( 'try ๋ธ”๋ก ์‹œ์ž‘' );
  if (confirm('์—๋Ÿฌ๋ฅผ ๋งŒ๋“œ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?')) ์ด์ƒํ•œ_์ฝ”๋“œ();
} catch (e) { 
  // ์—๋Ÿฌ ์žก์Œ
  // e๋ฅผ ์ด์šฉํ•ด์„œ ์—๋Ÿฌ์˜ ์ข…๋ฅ˜๋„ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ.
  alert( 'catch' );
} finally { 
  // ์—๋Ÿฌ๊ฐ€ ์žˆ๋“  ์—†๋“  ๋ฌด์กฐ๊ฑด ์‹คํ–‰
  alert( 'finally' );
}

-> http ํ†ต์‹  status code ์“ธ ๋•Œ custom error ๋งŽ์ด ๋งŒ๋“ ๋‹ค.

๋กœ๊ทธ์ธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์˜ˆ์‹œ ์ฝ”๋“œ

์ฝœ๋ฐฑํ•จ์ˆ˜

๋‚˜์ค‘์— ์‹คํ–‰ํ•  ํ•จ์ˆ˜! ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด์„œ ๋„˜๊ธฐ๋ฉด ์•ˆ๋จ. ์ด๋ฆ„๋งŒ ๋„˜๊ฒจ์•ผํ•จ.
์ฝœ๋ฐฑ ์ง€์˜ฅ... => Promise ๋กœ ํ•ด๊ฒฐ.

userData.login(
    id, 
    pw, 
    (user) => {
        userData.getData(
            user,
            (userData) => {
                ..์ฝœ๋ฐฑ์— ์ฝœ๋ฐฑ..
            },
            (fail) => {
                ..์ฝœ๋ฐฑ์— ์ฝœ๋ฐฑ..
            }
        );
    },
    (fail) => {
        ..์ฝœ๋ฐฑ์— ์ฝœ๋ฐฑ..
    },
    (user) => { //์ด๋ฏธ์ง€ ๋กœ๋“œ
        ..์ฝœ๋ฐฑ์— ์ฝœ๋ฐฑ..
    },
    (user) => { // ๊ณ„์ขŒ ์—ฐ๋™
        ..์ฝœ๋ฐฑ์— ์ฝœ๋ฐฑ..
    },
);

Promise - ๋น„๋™๊ธฐ

์„œ๋ฒ„๋ž‘ ํ†ต์‹ ํ•  ๋•Œ ์‚ฌ์šฉ.
๋กœ๊ทธ์ธ ์„ฑ๊ณต, ์ •์ƒ์ ์ธ url๋กœ ์ ‘๊ทผํ–ˆ๋Š”์ง€ ์ด๋Ÿฐ๊ฑฐ ์ „๋ถ€ ์ด๊ฑธ๋กœ ์žก๋Š”๋‹ค.

// ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์–ธ์ œ ๋ถ€๋ฅผ์ง„ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์–ธ์ œ ๋ถ€๋ฅด๊ฒ ๋‹ค๊ณ  (๋น„๋™๊ธฐ) ์•ฝ์†.
// resolve(value) โ€” ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ๋งˆ๋ฌด๋ฆฌ๋˜๋ฉด ํ˜ธ์ถœ, ๊ฒฐ๊ณผ๋Š” value์— ๋‹ด๊น€
// reject(error) โ€” ์ž‘์—…์ด ์‹คํŒจ์‹œ ํ˜ธ์ถœ, error๋Š” error์— ๋‹ด๊น€
let promise = new Promise(function(resolve, reject) {
  // ํ”„๋ผ๋ฏธ์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋ฉด executor ํ•จ์ˆ˜ ์ž๋™ ์‹คํ–‰.
  // 10์ดˆ ๋’ค์— ์ผ์ด ์„ฑ๊ณต์ ์œผ๋กœ ๋๋‚ฌ๋‹ค๋Š” ์‹ ํ˜ธ๊ฐ€ ์ „๋‹ฌ๋˜๋ฉด์„œ result๋Š” 'done'์ด ๋ฉ๋‹ˆ๋‹ค.
  setTimeout(() => resolve("์ด์ œ์•ผ ๋๋‚จ!"), 10000);
});
console.log('hello world'); // ๋ฐ”๋กœ ์ฐํž˜. promise ์•ˆ์— ์žˆ๋Š”๊ฑด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ผ์–ด๋‚˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ.
console.log(promise); // 10์ดˆ ๋™์•ˆ์€ pending
console.log('hello world2'); // ์—ญ์‹œ ๋ฐ”๋กœ ์ฐํž˜.
// ์ด ํ˜•ํƒœ๋ฅผ ์ž์ฃผ ๋งŒ๋‚˜๊ฒŒ ๋ ํ…Œ๋‹ˆ ์ž˜ ๊ธฐ์–ตํ•ด๋‘๊ธฐ.
new Promise((resolve, reject) => { ... code ... })
    .then(...code...) // Promise ์•ˆ์˜ ๊ฒƒ์ด ์ˆ˜ํ–‰์ด ๋๋‚˜์•ผ then ์ด ์ˆ˜ํ–‰๋œ๋‹ค.
    .then(...code...) // ์•ž์˜ then ์ด ๋๋‚˜์•ผ ์ˆ˜ํ–‰๋œ๋‹ค. Promise Chaining
    .finally(...code...) // ์„ฑ๊ณต ์‹คํŒจ์™€ ์ƒ๊ด€ ์—†์ด Promise ์ฒ˜๋ฆฌ ํ›„ ์‹คํ–‰.
    .catch(...code...)
// ์ •๋ฆฌ ์ „
loadScript('1.js', function(error, script) {
    if (error) {
      handleError(error);
    } else {
      // ...
      loadScript('2.js', function(error, script) {
        if (error) {
          handleError(error);
        } else {
          // ...
          loadScript('3.js', function(error, script) {
            if (error) {
              handleError(error);
            } else {
              // ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋กœ๋”ฉ๋œ ํ›„, ์‹คํ–‰ ํ๋ฆ„์ด ์ด์–ด์ง‘๋‹ˆ๋‹ค. (*)
            }
          });
        }
      })
    }
  });
  // ์ •๋ฆฌ ํ›„ - catch๋„ ๋„ฃ์–ด์ฃผ๋ฉด ๋จ.
loadScript("/article/promise-chaining/one.js")
  .then(script => loadScript("/article/promise-chaining/two.js"))
  .then(script => loadScript("/article/promise-chaining/three.js"))
  .then(script => {
    // ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ •์ƒ์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์™”๊ธฐ ๋•Œ๋ฌธ์— ์Šคํฌ๋ฆฝํŠธ ๋‚ด์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    one();
    two();
    three();
  });
new Promise(function(resolve, reject) { // Promise์˜ ์‹คํ–‰์ด callback ์™œ๋ƒ๋ฉด ํ•จ์ˆ˜ ๋ฐ›์œผ๋‹ˆ๊น
  setTimeout(() => reject('error'), 1000); 
}).then(function(result) { // resolve ์ด๋ฉด catch์— ๋“ค์–ด๊ฐ€์งˆ ์•Š์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ๊นŒ์ง€ ๋‚˜์˜ด.
  alert(result + ' : ์ž˜ ์ˆ˜ํ–‰!');
  return result + 'one';
}).catch(function(result) { // reject ์ด๋ฉด catch์— ์žกํžˆ๋ฏ€๋กœ ์—ฌ๊ธฐ๋งŒ ๋‚˜์˜ด.
  alert(result + ' : ์• ๋Ÿฌ ๋ฐœ์ƒ!'); // 1
  return result + 'two';
}).then(function(result) {
  alert(result + ' : ์ž˜ ์ˆ˜ํ–‰!'); // 2
  return result + 'three';
});

Promise.all , allSettled ์ด๋Ÿฐ ๋ฉ”์„œ๋“œ๋„ ์žˆ๋‹ค. ๋‚˜์ค‘์— ์•Œ์•„๋ด์š”~

fetch

// fetch๋Š” Promise ๋ฐฉ์‹์ด๋ผ then, catch, finally ์“ธ ์ˆ˜ ์žˆ๋‹ค.
fetch('https://์–ด์ฉŒ๊ตฌ.json')
    .then(function(response) {
        console.log(1);
        return response.json();
    })
    .then(function(json) {
        console.log(2);
        console.log(json);
        return json
    })
console.log(3);
console.log(4);

async, await

Promise์˜ syntatic sugar.
์›๋ž˜ await๋Š” async ์•ˆ์—์„œ๋งŒ ๋™์ž‘ํ–ˆ๋Š”๋ฐ ๋ฐ–์—์„œ๋„ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฐ”๋€Œ์—ˆ๋‹ค.

// async๋ฅผ ๋ถ™์ด๋ฉด Promise ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
async function f() {
  let promise = new Promise((resolve, reject) => {
    setTimeout(() => resolve("์™„๋ฃŒ!"), 1000)
  });
  // promise ๊ฐ€ ๋๋‚ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
  let result = await promise;
  let response await fetch('์–ด์ฉŒ๊ตฌ.json'); // ์ด๋Ÿฐ์‹์œผ๋กœ ์‚ฌ์šฉ.
  return 100;
}
f().then(alert);

ํ˜ธ์ถœ ์Šคํƒ

// ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ๋งˆ๋‹ค ์œ„๋กœ ์Œ“์ž„.
anonymous // ๊ฐ€์ƒ ์ „์—ญ ์ปจํ…์ŠคํŠธ. ์™„์ „ ์™„์ „ ์™„์ „ ๋งˆ์ง€๋ง‰์— ๋น ์ง.

Event Loop

๋ฐฑ๊ทธ๋ผ์šด๋“œ, ํ…Œ์Šคํฌ ํ, ํ˜ธ์ถœ์Šคํƒ์˜ ๋ฃจํ”„๋ฅผ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ผ๊ณ  ํ•œ๋‹ค. ์™„๋ฒฝํ•œ ์ดํ•ด๋ฅผ ํ˜„ ๋‹จ๊ณ„์—์„œ ํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ ๋Œ€๋‹จํ•ด์ง€๋ ค๋ฉด(?) ๊ผญ ์•Œ์•„์•ผํ•˜๋Š” ๋‚ด์šฉ!

1. ๋ฉ”๋ชจ๋ฆฌ์— ์‹คํ–‰ํ•จ์ˆ˜ ์ ์žฌ
2. ํ˜ธ์ถœ์Šคํƒ์— anonymous๊ฐ€ ๋“ค์–ด๊ฐ
3. console.log(1)์ด ํ˜ธ์ถœ ์Šคํƒ์— ์Œ“์ž„
4. console.log(1)์ด ์‹คํ–‰๋˜์–ด console์— 1์„ ์ฐ๊ณ  ์Šคํƒ์—์„œ ์ œ๊ฑฐ
5. ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— timer(์‹คํ–‰, 1) (๊ณ„์† ์‹œ๊ฐ„์„ ์นด์šดํŒ…ํ•˜๋Š” ์ค‘)
6. console.log(3)์ด ์Šคํƒ์— ์Œ“์ž„
7. console.log(3)์ด ์‹คํ–‰๋˜์–ด console์— 3๋ฅผ ์ฐ๊ณ  ์Šคํƒ์—์„œ ์ œ๊ฑฐ
8. anonymous ์‚ฌ๋ผ์ง
9. 1์ดˆ๊ฐ€ ์ง€๋‚˜๊ฐ€๋ฉด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ํƒœ์Šคํฌ ํ๋กœ '์‹คํ–‰' ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ด(๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์—†์–ด์ง)
10. ํƒœ์Šคํฌ ํ์—์„œ ์‹คํ–‰ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ์Šคํƒ์œผ๋กœ ๊ฐ€์ ธ์˜ด
11. '์‹คํ–‰'ํ•จ์ˆ˜ ์œ„์— console.log(2)๊ฐ€ ์Œ“์ž„
12. console.log(2)์ด ์‹คํ–‰๋˜์–ด console์— 2๋ฅผ ์ฐ๊ณ  ์Šคํƒ์—์„œ ์‚ฌ๋ผ์ง
13. '์‹คํ–‰' ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ์Šคํƒ์—์„œ ์‚ฌ๋ผ์ง




3. ๋ณด๋ผ๋‹˜์˜ ๊นƒํ—™ ํŠน๊ฐ•!

README.md

  • awesome keyword readme ๊ฐ™์€ ํ‚ค์›Œ๋“œ๋กœ ๊ฒ€์ƒ‰ํ•ด์„œ ์—ฌ๋Ÿฌ ๋ฆฌ๋“œ๋ฏธ๋ฅผ ์ฐธ๊ณ ํ•ด๋ณด๋ฉด ์ข‹๋‹ค.
  • README ๋Š” ๋Œ€๋žต์ ์ธ ๋‚ด์šฉ๋งŒ ์“ฐ๊ณ  ์ƒ์„ธํ•œ ๊ฑด WIKI์— ๊ด€๋ฆฌํ•˜์ž.

commit

  • ์ปค๋ฐ‹์€ ๋…ผ๋ฆฌ์  ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ!

  • ๊ฐ€๋Šฅํ•˜๋ฉด ์ปค๋ฐ‹ ํฌ๊ธฐ๋Š” ์ž‘๊ฒŒ ์ชผ๊ฐœ์ž! ์ž‘์—… ๋‹จ์œ„ ๋ณ„๋กœ ์ž‘์„ฑํ•˜๊ธฐ.

  • ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ๊ตฌ์„ฑ / ๊ธฐ๋Šฅ ๋ณ„๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

  • ํŒŒ์ผ ์—ฌ๋Ÿฌ๊ฐœ ๋ญ‰ํ……์ด๋กœ ๊ฑด๋“œ๋ฆฌ๋Š” ๊ฑด ์ƒ๊ด€ ์—†๋Š”๋ฐ, + 1472 ์ค„์ธ๋ฐ 'XXX ์ž‘์—…' ์ด๋ผ๊ณ  ๋กœ๊ทธ ์ฐํ˜€์žˆ์œผ๋ฉด ๋‹น์‹ ์€ ๊ทธ ๋‚  ์‚ฌ๋งํ•œ๋‹ค (by ์กฐ์€)


commit message convention

  • ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ๊ทœ์น™
  • ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๊ณ  ์•Œ ์ˆ˜ ์žˆ์„ ์ •๋„๋กœ ๊ฐ„๋‹จ๋ช…๋ฃŒํ•˜๊ฒŒ ์ ์œผ๋ฉด ๋œ๋‹ค.
  • ๋ณ€๊ฒฝ๋ถ„์ด ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ๊ณผ ๋งž๋Š”์ง€
  • ์ด์ŠˆํŠธ๋ž˜์ปค์™€ ๋งค์นญ์ด ๋˜๋Š”์ง€.
  • ์†Œ์ŠคํŠธ๋ฆฌ ์“ฐ์ง€๋ง๊ณ  CLI ์“ฐ์ž. git status ๋ฅผ ์‚ฌ์šฉํ•˜์ž.

github ๊ด€๋ฆฌ ์ „๋žต

  • TIL
  • ์˜คํ”ˆ์†Œ์Šค ๊ธฐ์—ฌ
  • ๋ฆฌ๋ˆ…์Šค ๊ธฐ์ดˆ ์ปค๋งจ๋“œ ๋ผ์ธ ์•Œ๊ณ  ๊ฐ€์ž




4. Deep Dive

  1. prototype ๋งํฌ

prototype ์€ ์–ด๋–ค ๊ฐ์ฒด์˜ ๋ถ€๋ชจ ์—ญํ• ์„ ํ•˜๋Š”๋ฐ, ๋ชจ๋“  ๊ฐ์ฒด์—์„œ ๊ณต์œ ํ•˜๋Š” ํ•จ์ˆ˜๋‚˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์“ด๋‹ค. ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ ์„œ๋กœ ์ฐธ์กฐ๋ฅผ ํ•˜๊ณ  prototype chain์„ ๋งŒ๋“ค๋ฉฐ,,, ์ด๋Ÿฐ ๋‚ด์šฉ์ด์—ˆ๋Š”๋ฐ ์ฝ์–ด๋„ ์ฝ์–ด๋„ ๋์ด ์—†์—ˆ๋‹ค.

์ผ๋‹จ ์ดํ•ด๊ฐ€ ์•ˆ๊ฐ€๋Š”๊ฑด ์•„๋‹Œ๋ฐ prototype ๊ฐœ๋… ์ž์ฒด๊ฐ€ ์ข€ ์ถ”์ƒ์ ์ด๋‹ค๋ณด๋‹ˆ ์™œ..? ์™œ..? ๋์ด ์•ˆ๋‚˜์ง€ ํ•˜๋ฉด์„œ ๊ณ„์† ์ฝ์—ˆ๋‹ค... ๋‹ค์‹œ ๋ณด๋‹ˆ 293~345... 26์žฅ์„ ์ฝ์€๊ฑฐ์˜€๋‹ค......




๋น„๋™๊ธฐ ์ •๋ฆฌ (with ์กฐ์€๋‹˜)

๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‚ฌ์‹ค ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์–ธ์–ด๋ผ์„œ ํ•œ๋•€ํ•œ๋•€ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค. ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋งŒ๋‚˜๋ฉด Web API (ajax, DOM event, Timer) ์—๋‹ค๊ฐ€ ํ•ด๋‹น ์ž‘์—…์„ ๋„˜๊ฒจ๋ฒ„๋ฆฐ๋‹ค.
๊ทธ๋ฆฌ๊ณ  Web API๊ฐ€ ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋๋‚ด๋ฉด ์ž‘์—…์„ Task Queue์— ๋„ฃ์Œ.

์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ == call stack์ด ํ•˜๋‚˜๋‹ค.

Call stack์˜ ์ž‘์—…์ด ์ „๋ถ€ ๋๋‚ฌ๊ณ , Call stack ์ด ์™„์ „ํžˆ ๋น„๋ฉด (asynchronous ๊นŒ์ง€ ๋น ์ ธ๋‚˜๊ฐ€๋ฉด) Task Queue์˜ ์•„์ดํ…œ์„ Call Stack ์— ๋„ฃ๊ณ  ์ฒ˜๋ฆฌ.

๋น„๋™๊ธฐ์ธ ์ด์ƒ Web API์™€ Task Queue๋ฅผ ๊ฑฐ์ณ์„œ ์˜ฌ ์ˆ˜ ๋ฐ–์— ์—†์œผ๋ฏ€๋กœ ์ •์ƒ(?) order์— ์žˆ๋Š” ์• ๋“ค๋ณด๋‹ค ๋‚˜์ค‘์— ์‹คํ–‰๋œ๋‹ค.

profile
0๋…„์ฐจ iOS ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€