ν°μ€ν 리 λ·°
[JavaScript] μ λλ μ΄ν°μ async/await
κ°λ°κ°κ΅΄πΈ 2022. 8. 17. 19:37μ λλ μ΄ν°λ?
ES6μμ λμ λ μ λλ μ΄ν°(generator)λ μ½λ λΈλ‘μ μ€νμ μΌμ μ€μ§νλ€κ° νμν μμ μ μ¬κ°ν μ μλ νΉμν ν¨μμ λλ€. μ λλ μ΄ν°μ μΌλ° ν¨μμ μ°¨μ΄λ λ€μκ³Ό κ°μ΅λλ€.
1. μ λλ μ΄ν° ν¨μλ ν¨μ νΈμΆμμκ² ν¨μ μ€νμ μ μ΄κΆμ μλν μ μλ€.
ν¨μλ₯Ό νΈμΆν μ΄ν ν¨μ μ€νμ μ μ΄ν μ μλ μΌλ° ν¨μμ λ¬λ¦¬ μ λλ μ΄ν°λ ν¨μ νΈμΆμκ° ν¨μ μ€νμ μΌμ μ€μ§μν€κ±°λ μ¬κ°μν¬ μ μμ΅λλ€.
2. μ λλ μ΄ν° ν¨μλ ν¨μ νΈμΆμμ ν¨μμ μνλ₯Ό μ£Όκ³ λ°μ μ μλ€.
ν¨μκ° μ€νλκ³ μλ λμ ν¨μ μΈλΆμμ ν¨μ λ΄λΆλ‘ κ°μ μ λ¬νμ¬ ν¨μμ μνλ₯Ό λ³κ²½ν μ μλ μΌλ° ν¨μμ λ¬λ¦¬ μ λλ μ΄ν° ν¨μλ ν¨μ νΈμΆμμ μλ°©ν₯μΌλ‘ ν¨μμ μνλ₯Ό μ£Όκ³ λ°μ μ μμ΅λλ€.
3. μ λλ μ΄ν° ν¨μλ₯Ό νΈμΆνλ©΄ μ λλ μ΄ν° κ°μ²΄λ₯Ό λ°ννλ€.
μΌλ° ν¨μλ₯Ό νΈμΆνλ©΄ ν¨μ μ½λλ₯Ό μΌκ΄ μ€ννκ³ κ°μ λ°νλ°μ§λ§ μ λλ μ΄ν° ν¨μλ₯Ό νΈμΆνλ©΄ ν¨μ μ½λλ₯Ό μ€ννλ κ²μ΄ μλλΌ μ΄ν°λ¬λΈμ΄λ©΄μ λμμ μ΄ν°λ μ΄ν°μΈ μ λλ μ΄ν° κ°μ²΄λ₯Ό λ°νν©λλ€.
μ λλ μ΄ν° ν¨μμ μ μ
μ λλ μ΄ν° ν¨μλ function* ν€μλλ‘ μ μΈνλ©° νλ μ΄μμ yield ννμμ ν¬ν¨ν©λλ€. μ μ€ν°λ¦¬μ€ν¬(*)μ μμΉλ function ν€μλμ ν¨μ μ΄λ¦ μ¬μ΄ μ΄λλ μκ΄μμ§λ§ function ν€μλ λ°λ‘ λ€μ λΆμ΄λ κ²μ κΆμ₯ν©λλ€.
// μ λλ μ΄ν° ν¨μ μ μΈλ¬Έ
function* genDecFunc() {
yield 1;
}
// μ λλ μ΄ν° ν¨μ ννμ
const genExpFunc = function* () {
yield 1;
};
// μ λλ μ΄ν° λ©μλ
const obj = {
* genObjMethod() {
yield 1;
}
};
// μ λλ μ΄ν° ν΄λμ€ λ©μλ
class MyClass {
* genClsMethod() {
yield 1;
}
}
μ λλ μ΄ν° ν¨μλ νμ΄ν ν¨μλ‘ μ μν μ μκ³ new μ°μ°μμ ν¨κ» μμ±μ ν¨μλ‘ νΈμΆν μ μμ΅λλ€.
const genArrowFunc = * () => {
yield 1;
}; // SyntaxError: Unexpected token '*'
function* genFunc() {
yield 1;
}
new genFunc(); // TypeError: genFunc is not a constructor
μ λλ μ΄ν° κ°μ²΄
μ λν μ΄ν° ν¨μλ₯Ό νΈμΆνλ©΄ μ΄ν°λ¬λΈμ΄λ©΄μ λμμ μ΄ν°λ μ΄ν°μΈ μ λλ μ΄ν° κ°μ²΄λ₯Ό μμ±ν΄ λ°νν©λλ€.
μ¦, μ λλ μ΄ν° κ°μ²΄λ Symbol.iterator λ©μλλ₯Ό μμλ°λ μ΄ν°λ¬λΈμ΄λ©΄μ, value, done νλ‘νΌν°λ₯Ό κ°λ μ΄ν°λ μ΄ν° 리μ νΈ κ°μ²΄λ₯Ό λ°ννλ next λ©μλλ₯Ό μμ νλ μ΄ν°λ μ΄ν°μ λλ€. λ°λΌμ Symbol.iterator λ©μλλ₯Ό νΈμΆν΄μ λ³λλ‘ μ΄ν°λ μ΄ν°λ₯Ό μμ±ν νμκ° μμ΅λλ€.
// μ λλ μ΄ν° ν¨μ
function* genFunc() {
yield 1;
yield 2;
yield 3;
}
// μ λλ μ΄ν° ν¨μλ₯Ό νΈμΆνλ©΄ μ λλ μ΄ν° κ°μ²΄λ₯Ό λ°ννλ€.
const generator = genFunc();
// μ λλ μ΄ν° κ°μ²΄λ μ΄ν°λ¬λΈμ΄λ©΄μ λμμ μ΄ν°λ μ΄ν°λ€.
// μ΄ν°λ¬λΈμ Symbol.iterator λ©μλλ₯Ό μ§μ ꡬννκ±°λ νλ‘ν νμ
체μΈμ ν΅ν΄ μμλ°μ κ°μ²΄λ€.
console.log(Symbol.iterator in generator); // true
// μ΄ν°λ μ΄ν°λ next λ©μλλ₯Ό κ°λλ€.
console.log('next' in generator); // true
μ λλ μ΄ν° κ°μ²΄λ next λ©μλ μΈμ μ΄ν°λ μ΄ν°μ μλ return, throw λ©μλλ₯Ό μΆκ°λ‘ κ°μ΅λλ€. λ°λΌμ μ λλ μ΄ν° κ°μ²΄μ μΈ κ°μ λ©μλλ₯Ό νΈμΆνλ©΄ λ€μκ³Ό κ°μ΄ λμν©λλ€.
- next λ©μλλ₯Ό νΈμΆνλ©΄ μ λλ μ΄ν° ν¨μμ yield ννμκΉμ§ μ½λ λΈλ‘μ μ€ννκ³ yieldλ κ°μ value νλ‘νΌν° κ°μΌλ‘, falseλ₯Ό done νλ‘νΌν° κ°μΌλ‘ κ°λ μ΄ν°λ μ΄ν° 리μ νΈ κ°μ²΄λ₯Ό λ°ν
- return λ©μλλ₯Ό νΈμΆνλ©΄ μΈμλ‘ μ λ¬λ°μ κ°μ value νλ‘νΌν° κ°μΌλ‘, trueλ₯Ό done νλ‘νΌν° κ°μΌλ‘ κ°λ μ΄λ¬ν μ΄ν° 리μ νΈ κ°μ²΄λ₯Ό λ°ν
- throw λ©μλλ₯Ό νΈμΆνλ©΄ μΈμλ‘ μ λ¬λ°μ μλ¬λ₯Ό λ°μμν€κ³ undefinedλ₯Ό value νλ‘νΌν° κ°μΌλ‘, trueλ₯Ό done νλ‘νΌν° κ°μΌλ‘ κ°λ μ΄ν°λ μ΄ν° 리μ νΈ κ°μ²΄λ₯Ό λ°ν
function* genFunc() {
try {
yield 1;
yield 2;
yield 3;
} catch (e) {
console.error(e);
}
}
const generator = genFunc();
console.log(generator.next()); // {value: 1, done: false}
console.log(generator.return('End!')); // {value: "End!", done: true}
console.log(generator.throw('Error!')); // {value: undefined, done: true}
μ λλ μ΄ν°μ μΌμ μ€μ§μ μ¬κ°
μ λλ μ΄ν°λ ν¨μ νΈμΆμμκ² μ μ΄κΆμ μλνμ¬ yield ν€μλμ next λ©μλλ₯Ό ν΅ν΄ μ€νμ μΌμ μ€μ§νκ³ νμν μμ μ ν¨μ μ€νμ μ¬κ°ν μ μμ΅λλ€.
yield ν€μλλ μ λλ μ΄ν° ν¨μμ μ€νμ μΌμ μ€μμν€κ±°λ yield ν€μλ λ€μ μ€λ ννμμ νκ° κ²°κ³Όλ₯Ό μ λλ μ΄ν°
ν¨μ νΈμΆμμκ² λ°νν©λλ€.
// μ λλ μ΄ν° ν¨μ
function* genFunc() {
yield 1;
yield 2;
yield 3;
}
// μ λλ μ΄ν° ν¨μλ₯Ό νΈμΆνλ©΄ μ λλ μ΄ν° κ°μ²΄λ₯Ό λ°ννλ€.
// μ΄ν°λ¬λΈμ΄λ©΄μ λμμ μ΄ν°λ μ΄ν°μΈ μ λλ μ΄ν° κ°μ²΄λ next λ©μλλ₯Ό κ°λλ€.
const generator = genFunc();
// μ²μ next λ©μλλ₯Ό νΈμΆνλ©΄ 첫 λ²μ§Έ yield ννμκΉμ§ μ€νλκ³ μΌμ μ€μ§λλ€.
// next λ©μλλ μ΄ν°λ μ΄ν° 리μ νΈ κ°μ²΄({value, done})λ₯Ό λ°ννλ€.
// value νλ‘νΌν°μλ 첫 λ²μ§Έ yield ννμμμ yieldλ κ° 1μ΄ ν λΉλλ€.
// done νλ‘νΌν°μλ μ λλ μ΄ν° ν¨μκ° λκΉμ§ μ€νλμλμ§λ₯Ό λνλ΄λ falseκ° ν λΉλλ€.
console.log(generator.next()); // {value: 1, done: false}
// λ€μ next λ©μλλ₯Ό νΈμΆνλ©΄ λ λ²μ§Έ yield ννμκΉμ§ μ€νλκ³ μΌμ μ€μ§λλ€.
// next λ©μλλ μ΄ν°λ μ΄ν° 리μ νΈ κ°μ²΄({value, done})λ₯Ό λ°ννλ€.
// value νλ‘νΌν°μλ λ λ²μ§Έ yield ννμμμ yieldλ κ° 2κ° ν λΉλλ€.
// done νλ‘νΌν°μλ μ λλ μ΄ν° ν¨μκ° λκΉμ§ μ€νλμλμ§λ₯Ό λνλ΄λ falseκ° ν λΉλλ€.
console.log(generator.next()); // {value: 2, done: false}
// λ€μ next λ©μλλ₯Ό νΈμΆνλ©΄ μΈ λ²μ§Έ yield ννμκΉμ§ μ€νλκ³ μΌμ μ€μ§λλ€.
// next λ©μλλ μ΄ν°λ μ΄ν° 리μ νΈ κ°μ²΄({value, done})λ₯Ό λ°ννλ€.
// value νλ‘νΌν°μλ μΈ λ²μ§Έ yield ννμμμ yieldλ κ° 3μ΄ ν λΉλλ€.
// done νλ‘νΌν°μλ μ λλ μ΄ν° ν¨μκ° λκΉμ§ μ€νλμλμ§λ₯Ό λνλ΄λ falseκ° ν λΉλλ€.
console.log(generator.next()); // {value: 3, done: false}
// λ€μ next λ©μλλ₯Ό νΈμΆνλ©΄ λ¨μ yield ννμμ΄ μμΌλ―λ‘ μ λλ μ΄ν° ν¨μμ λ§μ§λ§κΉμ§ μ€ννλ€.
// next λ©μλλ μ΄ν°λ μ΄ν° 리μ νΈ κ°μ²΄({value, done})λ₯Ό λ°ννλ€.
// value νλ‘νΌν°μλ μ λλ μ΄ν° ν¨μμ λ°νκ° undefinedκ° ν λΉλλ€.
// done νλ‘νΌν°μλ μ λλ μ΄ν° ν¨μκ° λκΉμ§ μ€νλμμμ λνλ΄λ trueκ° ν λΉλλ€.
console.log(generator.next()); // {value: undefined, done: true}
- μ λλ μ΄ν° κ°μ²΄μ next λ©μλλ₯Ό νΈμΆνλ©΄ yield ννμκΉμ§ μ€νλκ³ μΌμ μ€μ§(suspend)λκ³ ν¨μ μ μ΄κΆμ΄ νΈμΆμλ‘ μλ
- μ λλ μ΄ν° κ°μ²΄μ next λ©μλλ value, done νλ‘νΌν°λ₯Ό κ°λ μ΄ν°λ μ΄ν° 리μ νΈ κ°μ²΄λ₯Ό λ°ν
- value νλ‘νΌν°μλ yieldμ κ°, done νλ‘νΌν°μλ ν¨μκ° λκΉμ§ μ€νλμλμ§λ₯Ό λνλ΄λ λΆλ¦¬μΈ κ°μ΄ ν λΉ
generator.next() -> yield -> generator.next() -> yield -> ... -> generator.next() -> return
μ΄μ²λΌ next λ©μλλ₯Ό λ°λ³΅ νΈμΆνμ¬ yield ννμκΉμ§ μ€νκ³Ό μΌμ μ€μ§λ₯Ό λ°λ³΅νλ€κ° μ λλ μ΄ν° ν¨μκ° λκΉμ§ μ€νλλ©΄ next λ©μλκ° λ°ννλ μ΄ν°λ μ΄ν° 리μ νΈ κ°μ²΄μ value νλ‘νΌν°μ done νλ‘νΌν°μλ μ λλ μ΄ν° ν¨μμ λ°νκ°κ³Ό λκΉμ§ μ€νλμμμ λνλ΄λ trueκ° ν λΉλ©λλ€.
λν μ λλ μ΄ν° κ°μ²΄μ next λ©μλμ μ λ¬ν μΈμλ μ λλ μ΄ν° ν¨μμ yield ννμμ ν λΉλ°λ λ³μμ ν λΉλμ΄ ν¨μ νΈμΆμμ ν¨μμ μνλ₯Ό μ£Όκ³ λ°μ μ μμ΅λλ€.
function* genFunc() {
// μ²μ next λ©μλλ₯Ό νΈμΆνλ©΄ 첫 λ²μ§Έ yield ννμκΉμ§ μ€νλκ³ μΌμ μ€μ§λλ€.
// μ΄λ yieldλ κ° 1μ next λ©μλκ° λ°νν μ΄ν°λ μ΄ν° 리μ νΈ κ°μ²΄μ value νλ‘νΌν°μ ν λΉλλ€.
// x λ³μμλ μμ§ μ무κ²λ ν λΉλμ§ μμλ€. x λ³μμ κ°μ next λ©μλκ° λ λ²μ§Έ νΈμΆλ λ κ²°μ λλ€.
const x = yield 1;
// λ λ²μ§Έ next λ©μλλ₯Ό νΈμΆν λ μ λ¬ν μΈμ 10μ 첫 λ²μ§Έ yield ννμμ ν λΉλ°λ x λ³μμ ν λΉλλ€.
// μ¦, const x = yield 1;μ λ λ²μ§Έ next λ©μλλ₯Ό νΈμΆνμ λ μλ£λλ€.
// λ λ²μ§Έ next λ©μλλ₯Ό νΈμΆνλ©΄ λ λ²μ§Έ yield ννμκΉμ§ μ€νλκ³ μΌμ μ€μ§λλ€.
// μ΄λ yieldλ κ° x + 10μ next λ©μλκ° λ°νν μ΄ν°λ μ΄ν° 리μ νΈ κ°μ²΄μ value νλ‘νΌν°μ ν λΉλλ€.
const y = yield (x + 10);
// μΈ λ²μ§Έ next λ©μλλ₯Ό νΈμΆν λ μ λ¬ν μΈμ 20μ λ λ²μ§Έ yield ννμμ ν λΉλ°λ y λ³μμ ν λΉλλ€.
// μ¦, const y = yield (x + 10);λ μΈ λ²μ§Έ next λ©μλλ₯Ό νΈμΆνμ λ μλ£λλ€.
// μΈ λ²μ§Έ next λ©μλλ₯Ό νΈμΆνλ©΄ ν¨μ λκΉμ§ μ€νλλ€.
// μ΄λ μ λλ μ΄ν° ν¨μμ λ°νκ° x + yλ next λ©μλκ° λ°νν μ΄ν°λ μ΄ν° 리μ νΈ κ°μ²΄μ value νλ‘νΌν°μ ν λΉλλ€.
// μΌλ°μ μΌλ‘ μ λλ μ΄ν°μ λ°νκ°μ μλ―Έκ° μλ€.
// λ°λΌμ μ λλ μ΄ν°μμλ κ°μ λ°νν νμκ° μκ³ returnμ μ’
λ£μ μλ―Έλ‘λ§ μ¬μ©ν΄μΌ νλ€.
return x + y;
}
// μ λλ μ΄ν° ν¨μλ₯Ό νΈμΆνλ©΄ μ λλ μ΄ν° κ°μ²΄λ₯Ό λ°ννλ€.
// μ΄ν°λ¬λΈμ΄λ©° λμμ μ΄ν°λ μ΄ν°μΈ μ λλ μ΄ν° κ°μ²΄λ next λ©μλλ₯Ό κ°λλ€.
const generator = genFunc(0);
// μ²μ νΈμΆνλ next λ©μλμλ μΈμλ₯Ό μ λ¬νμ§ μλλ€.
// λ§μ½ μ²μ νΈμΆνλ next λ©μλμ μΈμλ₯Ό μ λ¬νλ©΄ 무μλλ€.
// next λ©μλκ° λ°νν μ΄ν°λ μ΄ν° 리μ νΈ κ°μ²΄μ value νλ‘νΌν°μλ 첫 λ²μ§Έ yieldλ κ° 1μ΄ ν λΉλλ€.
let res = generator.next();
console.log(res); // {value: 1, done: false}
// next λ©μλμ μΈμλ‘ μ λ¬ν 10μ genFunc ν¨μμ x λ³μμ ν λΉλλ€.
// next λ©μλκ° λ°νν μ΄ν°λ μ΄ν° 리μ νΈ κ°μ²΄μ value νλ‘νΌν°μλ λ λ²μ§Έ yieldλ κ° 20μ΄ ν λΉλλ€.
res = generator.next(10);
console.log(res); // {value: 20, done: false}
// next λ©μλμ μΈμλ‘ μ λ¬ν 20μ genFunc ν¨μμ y λ³μμ ν λΉλλ€.
// next λ©μλκ° λ°νν μ΄ν°λ μ΄ν° 리μ νΈ κ°μ²΄μ value νλ‘νΌν°μλ μ λλ μ΄ν° ν¨μμ λ°νκ° 30μ΄ ν λΉλλ€.
res = generator.next(20);
console.log(res); // {value: 30, done: true}
μ΄μ²λΌ ν¨μ νΈμΆμλ next λ©μλλ₯Ό ν΅ν΄ yield ννμκΉμ§ ν¨μλ₯Ό μ€νμμΌ μ λλ μ΄ν° κ°μ²΄κ° κ΄λ¦¬νλ μνκ°μ κΊΌλ΄μ¬ μ μκ³ , next λ©μλμ μΈμλ₯Ό μ λ¬ν΄ μ λλ μ΄ν° κ°μ²΄μ μνλ₯Ό λ°μ΄λ£μ μ μμ΅λλ€.
μ΄λ¬ν μ λλ μ΄ν°μ νΉμ±μ νμ©νλ©΄ λΉλκΈ° μ²λ¦¬λ₯Ό λκΈ° μ²λ¦¬μ²λΌ ꡬνν μ μμ΅λλ€.
μ λλ μ΄ν°μ νμ©
μ΄ν°λ¬λΈμ ꡬν
μ λλ μ΄ν° ν¨μλ₯Ό μ¬μ©νλ©΄ μ΄ν°λ μ΄μ νλ‘ν μ½μ μ€μν΄ μ΄ν°λ¬λΈμ μμ±νλ λ°©μλ³΄λ€ κ°λ¨ν μ΄ν°λ¬λΈμ ꡬνν μ μμ΅λλ€.
// 1. 무ν μ΄ν°λ¬λΈμ μμ±νλ ν¨μ
const infiniteFibonacci = (function () {
let [pre, cur] = [0, 1];
return {
[Symbol.iterator]() { return this; },
next() {
[pre, cur] = [cur, pre + cur];
// 무ν μ΄ν°λ¬λΈμ΄λ―λ‘ done νλ‘νΌν°λ₯Ό μλ΅νλ€.
return { value: cur };
}
};
}());
// infiniteFibonacciλ 무ν μ΄ν°λ¬λΈμ΄λ€.
for (const num of infiniteFibonacci) {
if (num > 10000) break;
console.log(num); // 1 2 3 5 8...2584 4181 6765
}
// 2. 무ν μ΄ν°λ¬λΈμ μμ±νλ μ λλ μ΄ν° ν¨μ
const infiniteFibonacci = (function* () {
let [pre, cur] = [0, 1];
while (true) {
[pre, cur] = [cur, pre + cur];
yield cur;
}
}());
// infiniteFibonacciλ 무ν μ΄ν°λ¬λΈμ΄λ€.
for (const num of infiniteFibonacci) {
if (num > 10000) break;
console.log(num); // 1 2 3 5 8...2584 4181 6765
}
λΉλκΈ° μ²λ¦¬
μ λλ μ΄ν° ν¨μλ next λ©μλμ yield ννμμ ν΅ν΄ ν¨μ νΈμΆμμ ν¨μμ μνλ₯Ό μ£Όκ³ λ°μ μ μκΈ° λλ¬Έμ νλ‘λ―Έμ€λ₯Ό μ¬μ©ν λΉλκΈ° μ²λ¦¬λ₯Ό λκΈ° μ²λ¦¬μ²λΌ ꡬνν μ μμ΅λλ€. μ¦, νλ‘λ―Έμ€μ νμ μ²λ¦¬ λ©μλ then/catch/finally μμ΄ λΉλκΈ° μ²λ¦¬ κ²°κ³Όλ₯Ό λ°ννλλ‘ κ΅¬νν μ μμ΅λλ€.
// node-fetchλ node.js νκ²½μμ window.fetch ν¨μλ₯Ό μ¬μ©νκΈ° μν ν¨ν€μ§λ€.
// λΈλΌμ°μ νκ²½μμ μ΄ μμ λ₯Ό μ€ννλ€λ©΄ μλ μ½λλ νμ μλ€.
// https://github.com/node-fetch/node-fetch
const fetch = require('node-fetch');
// μ λλ μ΄ν° μ€νκΈ°
const async = generatorFunc => {
const generator = generatorFunc(); // β‘
const onResolved = arg => {
const result = generator.next(arg); // β€
return result.done
? result.value // β¨
: result.value.then(res => onResolved(res)); // β¦
};
return onResolved; // β’
};
(async(function* fetchTodo() { // β
const url = 'https://jsonplaceholder.typicode.com/todos/1';
const response = yield fetch(url); // β₯
const todo = yield response.json(); // β§
console.log(todo);
// {userId: 1, id: 1, title: 'delectus aut autem', completed: false}
})()); // β£
async/awaitμ μ¬μ©νλ©΄ μ μμ μ async ν¨μμ κ°μ μ λλ μ΄ν° μ€νκΈ°λ₯Ό μ¬μ©ν νμλ μμ§λ§ νμνλ€λ©΄ co λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ κ²μ΄ κΆμ₯λ©λλ€.
const fetch = require('node-fetch');
// https://github.com/tj/co
const co = require('co');
co(function* fetchTodo() {
const url = 'https://jsonplaceholder.typicode.com/todos/1';
const response = yield fetch(url);
const todo = yield response.json();
console.log(todo);
// { userId: 1, id: 1, title: 'delectus aut autem', completed: false }
});
async/await
ES8μμ μ λλ μ΄ν°λ³΄λ€ κ°λ¨νκ³ κ°λ μ± μ’κ² λΉλκΈ° μ²λ¦¬λ₯Ό λκΈ° μ²λ¦¬μ²λΌ λμνλλ‘ κ΅¬νν μ μλ async/awaitκ° λμ λμμ΅λλ€.
- async/awaitλ νλ‘λ―Έμ€λ₯Ό κΈ°λ°μΌλ‘ λμ
- async/awaitμ μ¬μ©νλ©΄ λΉλκΈ° μ²λ¦¬λ₯Ό νμ μ²λ¦¬ν νμ μμ΄ λ§μΉ λκΈ° μ²λ¦¬μ²λΌ νλ‘λ―Έμ€κ° κ²°κ³Όλ₯Ό λ°ν
const fetch = require('node-fetch');
async function fetchTodo() {
const url = 'https://jsonplaceholder.typicode.com/todos/1';
const response = await fetch(url);
const todo = await response.json();
console.log(todo);
// {userId: 1, id: 1, title: 'delectus aut autem', completed: false}
}
fetchTodo();
async ν¨μ
async ν¨μλ async ν€μλλ₯Ό μ¬μ©ν΄ μ μνλ©° μΈμ λ νλ‘λ―Έμ€λ₯Ό λ°νν©λλ€. async ν¨μκ° λͺ μμ μΌλ‘ νλ‘λ―Έμ€λ₯Ό λ°ννμ§ μλλΌλ async ν¨μλ μ묡μ μΌλ‘ λ°νκ°μ resolveνλ νλ‘λ―Έμ€λ₯Ό λ°νν©λλ€. λν, await ν€μλλ λ°λμ async ν¨μ λ΄λΆμμ μ¬μ©ν΄μΌ ν©λλ€.
// async ν¨μ μ μΈλ¬Έ
async function foo(n) { return n; }
foo(1).then(v => console.log(v)); // 1
// async ν¨μ ννμ
const bar = async function (n) { return n; };
bar(2).then(v => console.log(v)); // 2
// async νμ΄ν ν¨μ
const baz = async n => n;
baz(3).then(v => console.log(v)); // 3
// async λ©μλ
const obj = {
async foo(n) { return n; }
};
obj.foo(4).then(v => console.log(v)); // 4
// async ν΄λμ€ λ©μλ
class MyClass {
// async constructor() { } => SyntaxError: Class constructor may not be an async method
async bar(n) { return n; }
}
const myClass = new MyClass();
myClass.bar(5).then(v => console.log(v)); // 5
*ν΄λμ€μ constructor λ©μλλ μΈμ€ν΄μ€λ₯Ό λ°νν΄μΌ νμ§λ§ async ν¨μλ μΈμ λ νλ‘λ―Έμ€λ₯Ό λ°νν΄μΌ νκΈ° λλ¬Έμ constructor λ©μλλ async λ©μλκ° λ μ μμ
await ν€μλ
await ν€μλλ νλ‘λ―Έμ€κ° settled μνκ° λ λκΉμ§ λκΈ°νλ€κ° settled μνκ° λλ©΄ νλ‘λ―Έμ€κ° resolveν μ²λ¦¬ κ²°κ³Όλ₯Ό λ°νν©λλ€. await ν€μλλ λ°λμ νλ‘λ―Έμ€ μμμ μ¬μ©ν΄μΌ ν©λλ€.
const fetch = require('node-fetch');
const getGithubUserName = async id => {
const res = await fetch(`https://api.github.com/users/${id}`); // β
const { name } = await res.json(); // β‘
console.log(name); // Ungmo Lee
};
getGithubUserName('ungmo2');
- fetch ν¨μκ° μνν HTTP μμ²μ λν μλ²μ μλ΅μ΄ λμ°©ν΄μ fetch ν¨μκ° λ°νν νλ‘λ―Έμ€ settled μνκ° λ λκΉμ§ λκΈ°νλ€κ° μ΄ν νλ‘λ―Έμ€κ° settled μνκ° λλ©΄ νλ‘λ―Έμ€κ° resolveν μ²λ¦¬ κ²°κ³Όκ° res λ³μμ ν λΉ
μ΄μ²λΌ await ν€μλλ λ€μ μ€νμ μΌμ μ€μμμΌ°λ€κ° νλ‘λ―Έμ€κ° settled μνκ° λλ©΄ λ€μ μ¬κ°ν©λλ€. λ°λΌμ μμ λΉλκΈ° μ²λ¦¬μ κ²°κ³Όλ₯Ό κ°μ§κ³ λ€μ λΉλκΈ° μ²λ¦¬λ₯Ό μννλ μν©μ²λΌ μ²λ¦¬ μμκ° λ³΄μ₯λμ΄μΌ ν λ λͺ¨λ νλ‘λ―Έμ€μ await ν€μλλ₯Ό μ¨μ μμ°¨μ μΌλ‘ μ²λ¦¬ν μ μμ΅λλ€.
μλ¬ μ²λ¦¬
νλ‘λ―Έμ€λ₯Ό λ°ννλ λΉλκΈ° ν¨μλ λͺ μμ μΌλ‘ νΈμΆλ μ μκΈ° λλ¬Έμ νΈμΆμκ° λͺ νν©λλ€. λ°λΌμ νΈμΆμ λ°©ν₯μ μ νλλ μλ¬λ₯Ό async/awaitμμ try...catchλ¬Έμ μ¬μ©ν΄ μ²λ¦¬ν μ μμ΅λλ€.
const fetch = require('node-fetch');
const foo = async () => {
try {
const wrongUrl = 'https://wrong.url';
const response = await fetch(wrongUrl);
const data = await response.json();
console.log(data);
} catch (err) {
console.error(err); // TypeError: Failed to fetch
}
};
foo();
- foo ν¨μμ catch λ¬Έμ HTTP ν΅μ μμ λ°μν λ€νΈμν¬ μλ¬λΏ μλλΌ try μ½λ λΈλ‘ λ΄μ λͺ¨λ λ¬Έμμ λ°μν μΌλ°μ μΈ μλ¬κΉμ§ λͺ¨λ μΊμΉ
μ΄μ²λΌ async ν¨μ λ΄μμ catch λ¬Έμ μ¬μ©ν΄μ μλ¬ μ²λ¦¬λ₯Ό νμ§ μμΌλ©΄ async ν¨μλ λ°μν μλ¬λ₯Ό rejectνλ νλ‘λ―Έμ€λ₯Ό λ°ννκΈ° λλ¬Έμ Promise.prototype.catch νμ μ²λ¦¬ λ©μλλ₯Ό μ¬μ©ν μλ μμ΅λλ€.
const fetch = require('node-fetch');
const foo = async () => {
const wrongUrl = 'https://wrong.url';
const response = await fetch(wrongUrl);
const data = await response.json();
return data;
};
foo()
.then(console.log)
.catch(console.error); // TypeError: Failed to fetch
[μΆμ²] λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive
'JavaScript > λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[JavaScript] λͺ¨λ (1) | 2022.08.20 |
---|---|
[JavaScript] μλ¬ μ²λ¦¬ (0) | 2022.08.19 |
[JavaScript] νλ‘λ―Έμ€(Promise) (0) | 2022.08.17 |
[JavaScript] REST API (0) | 2022.08.16 |
[JavaScript] Ajax (0) | 2022.08.15 |
- Total
- Today
- Yesterday
- http
- ν¨μν νλ‘κ·Έλλ°
- μκ³ λ¦¬μ¦
- μΉ΄μΉ΄μ€ μΈν΄
- μ½λ©ν μ€νΈ
- μλ°
- λ€νΈμν¬
- TDD
- νλ‘νΌν°
- git
- ν¬ν¬μΈν°
- Baekjoon
- λ€μ΄λλ―Ή νλ‘κ·Έλλ°
- λ μ컬 νκ²½
- μ μ λ³μ
- λμμΈ ν¨ν΄
- μ΄μ체μ
- μλ°μ€ν¬λ¦½νΈ
- λ°±μ€ node.js
- map
- μ΄λΆνμ
- λ°±μ€ javascript
- νλ‘κ·Έλλ¨Έμ€
- 2019 μΉ΄μΉ΄μ€ κ°λ°μ κ²¨μΈ μΈν΄
- JavaScript
- λͺ¨λ μλ°μ€ν¬λ¦½νΈ deep dive
- νλ‘ν μ½
- κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°
- fp
- λ°±μ€
μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |