λΉλκΈ° ν¨μλ ν¨μ λ΄λΆμ λΉλκΈ°λ‘ λμνλ μ½λλ₯Ό ν¬ν¨ν ν¨μλ₯Ό λ§νλ€. λΉλκΈ° ν¨μλ₯Ό νΈμΆνλ©΄ ν¨μ λ΄λΆμ λΉλκΈ°λ‘ λμνλ μ½λκ° μλ£λμ§ μμλ€ ν΄λ κΈ°λ€λ¦¬μ§ μκ³ μ¦μ μ’ λ£λλ€. μ¦, λΉλκΈ° ν¨μ λ΄λΆμ λΉλκΈ°λ‘ λμνλ μ½λλ λΉλκΈ° ν¨μκ° μ’ λ£λ μ΄νμ μλ£λλ€. λ°λΌμ λΉλκΈ° ν¨μ λ΄λΆμ λΉλκΈ°λ‘ λμνλ μ½λμμ μ²λ¦¬ κ²°κ³Όλ₯Ό μΈλΆλ‘ λ°ννκ±°λ μμ μ€μ½νμ λ³μμ ν λΉνλ©΄ κΈ°λν λλ‘ λμνμ§ μλλ€.
// GET μμ²μ μν λΉλκΈ° ν¨μ
const get = url => {
const xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.send();
xhr.onload = () => {
if (xhr.status === 200) {
// μλ²μ μλ΅μ μ½μμ μΆλ ₯νλ€.
console.log(JSON.parse(xhr.response));
} else {
console.error(`${xhr.status} ${xhr.statusText}`);
}
};
};
// idκ° 1μΈ postλ₯Ό μ·¨λ
get('https://jsonplaceholder.typicode.com/posts/1');
/*
{
"userId": 1,
"id": 1,
"title": "sunt aut facere ...",
"body": "quia et suscipit ..."
}
*/
let g = 0;
// λΉλκΈ° ν¨μμΈ setTimeout ν¨μλ μ½λ°± ν¨μμ μ²λ¦¬ κ²°κ³Όλ₯Ό μΈλΆλ‘ λ°ννκ±°λ
// μμ μ€μ½νμ λ³μμ ν λΉνμ§ λͺ»νλ€.
setTimeout(() => { g = 100; }, 0);
console.log(g); // 0
console.log(g);
Promise μμ±μ ν¨μλ₯Ό new μ°μ°μμ ν¨κ» νΈμΆνλ©΄ νλ‘λ―Έμ€(Promise κ°μ²΄)λ₯Ό μμ±νλ€. Promise μμ±μ ν¨μλ λΉλκΈ° μ²λ¦¬λ₯Ό μνν μ½λ°±ν¨μλ₯Ό μΈμλ‘ μ λ¬λ°λλ° μ΄ μ½λ°±ν¨μλ resolveμ reject ν¨μλ₯Ό μΈμλ‘ μ λ¬λ°λλ€.
// νλ‘λ―Έμ€ μμ±
const promise = new Promise((resolve, reject) => {
// Promise ν¨μμ μ½λ°± ν¨μ λ΄λΆμμ λΉλκΈ° μ²λ¦¬λ₯Ό μννλ€.
if (/* λΉλκΈ° μ²λ¦¬ μ±κ³΅ */) {
resolve('result');
} else { /* λΉλκΈ° μ²λ¦¬ μ€ν¨ */
reject('failure reason');
}
});
Promise μμ±μ ν¨μκ° μΈμλ‘ μ λ¬λ°μ μ½λ°± ν¨μ λ΄λΆμμ λΉλκΈ° μ²λ¦¬λ₯Ό μννλ€. μ΄λ λΉλκΈ° μ²λ¦¬κ° μ±κ³΅νλ©΄ μ½λ°±ν¨μμ μΈμλ‘ μ λ¬λ°μ resolve ν¨μλ₯Ό νΈμΆνκ³ , λΉλκΈ° μ²λ¦¬κ° μ€ν¨νλ©΄ reject ν¨μλ₯Ό νΈμΆνλ€.
νλ‘λ―Έμ€λ λ€μκ³Ό κ°μ΄ νμ¬ λΉλκΈ° μ²λ¦¬κ° μ΄λ»κ² μ§νλκ³ μλμ§λ₯Ό λνλ΄λ μν(state) μ 보λ₯Ό κ°λλ€.
νλ‘λ―Έμ€ μν μ 보 | μλ―Έ | μν λ³κ²½ 쑰건 |
---|---|---|
pending | λΉλκΈ° μ²λ¦¬κ° μμ§ μνλμ§ μμ μν | νλ‘λ―Έμ€κ° μμ±λ μ§ν κΈ°λ³Έ μν |
fulfilled | λΉλκΈ° μ²λ¦¬κ° μνλ μν(μ±κ³΅) | resolve ν¨μ νΈμΆ |
rejected | λΉλκΈ° μ²λ¦¬κ° μνλ μν(μ€ν¨) | reject ν¨μ νΈμΆ |
μμ±λ μ§νμ νλ‘λ―Έμ€λ κΈ°λ³Έμ μΌλ‘ pending μνλ€. μ΄ν λΉλκΈ° μ²λ¦¬κ° μνλλ©΄ λΉλκΈ° μ²λ¦¬ κ²°κ³Όμ λ°λΌ λ€μκ³Ό κ°μ΄ νλ‘λ―Έμ€μ μνκ° λ³κ²½λλ€.
μ΄μ²λΌ νλ‘λ―Έμ€μ μνλ resolve λλ reject ν¨μλ₯Ό νΈμΆνλ κ²μΌλ‘ κ²°μ λλ€.
fulfilled λλ rejected μνλ₯Ό settled μνλΌκ³ νλ€. settle μνλ fulfilled λλ reject μνμ μκ΄μμ΄ pendingμ΄ μλ μνλ‘ λΉλκΈ° μ²λ¦¬κ° μνλ μνλ₯Ό λ§νλ€.
νλ‘λ―Έμ€λ pending μνμμ fulfilled λλ rejected μν, μ¦ settled μνλ‘ λ³νν μ μμ§λ§ settled μνκ° λλ©΄ λλ λ€λ₯Έ μνλ‘ λ³νν μ μλ€.
β κ²°λ‘
νλ‘λ―Έμ€λ λΉλκΈ° μ²λ¦¬ μνμ μ²λ¦¬ κ²°κ³Όλ₯Ό κ΄λ¦¬νλ κ°μ²΄λ€.
νλ‘λ―Έμ€λ λΉλκΈ° μ²λ¦¬ μνλ³νμ λ°λ₯Έ νμ μ²λ¦¬λ₯Ό νκΈ° μν΄ νμ λ©μλ then
, catch
, finally
λ₯Ό μ 곡νλ€.
νλ‘λ―Έμ€μ λΉλκΈ° μ²λ¦¬ μνκ° λ³ννλ©΄ νμ μ²λ¦¬ λ©μλμ μΈμλ‘ μ λ¬ν μ½λ°± ν¨μκ° μ νμ μΌλ‘ νΈμΆλλ€. μ΄ λ νμ μ²λ¦¬ λ©μλμ μ½λ°± ν¨μμ νλ‘λ―Έμ€μ μ²λ¦¬ κ²°κ³Όκ° μΈμλ‘ μ λ¬λλ€. λͺ¨λ νμ μ²λ¦¬ λ©μλλ νλ‘λ―Έμ€λ₯Ό λ°ννλ©°, λΉλκΈ°λ‘ λμνλ€. νλ‘λ―Έμ€μ νμ μ²λ¦¬ λ©μλλ λ€μκ³Ό κ°λ€.
Promise.prototype.then
then λ©μλλ λ κ°μ μ½λ°± ν¨μλ₯Ό μΈμλ‘ μ λ¬λ°λλ€.
// fulfilled
new Promise(resolve => resolve('fulfilled'))
.then(v => console.log(v), e => console.error(e)); // fulfilled
// rejected
new Promise((_, reject) => reject(new Error('rejected')))
.then(v => console.log(v), e => console.error(e)); // Error: rejected
Promise.prototype.catch
catch λ©μλλ ν κ°μ μ½λ°± ν¨μλ₯Ό μΈμλ‘ μ λ¬λ°λλ€. catch λ©μλμ μ½λ°± ν¨μλ νλ‘λ―Έμ€κ° rejected μνμΈ κ²½μ°λ§ νΈμΆλλ€. catch λ©μλλ thenκ³Ό λμΌνκΈ° λμνλ€.
// rejected
new Promise((_, reject) => reject(new Error('rejected')))
.then(undefined, e => console.log(e)); // Error: rejected
Promise.prototype.finally
finally λ©μλλ ν κ°μ μ½λ°± ν¨μλ₯Ό μΈμλ‘ μ λ¬λ°λλ€. finally λ©μλμ μ½λ°± ν¨μλ νλ‘λ―Έμ€μ μ±κ³΅(fulfilled) λλ μ€ν¨(rejected)μ μκ΄μμ΄ λ¬΄μ‘°κ±΄ ν λ² νΈμΆλλ€. finally λ©μλλ νλ‘λ―Έμ€μ μνμ μκ΄ μμ΄ κ³΅ν΅μ μΌλ‘ μνν΄μΌ ν μ²λ¦¬ λ΄μ©μ΄ μμ λ μ μ©νλ€.
new Promise(() => {})
.finally(() => console.log('finally')); // finally
const promiseGet = url => {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.send();
xhr.onload = () => {
if (xhr.status === 200) {
// μ±κ³΅μ μΌλ‘ μλ΅μ μ λ¬λ°μΌλ©΄ resolve ν¨μλ₯Ό νΈμΆνλ€.
resolve(JSON.parse(xhr.response));
} else {
// μλ¬ μ²λ¦¬λ₯Ό μν΄ reject ν¨μλ₯Ό νΈμΆνλ€.
reject(new Error(xhr.status));
}
};
});
};
// promiseGet ν¨μλ νλ‘λ―Έμ€λ₯Ό λ°ννλ€.
promiseGet('https://jsonplaceholder.typicode.com/posts/1')
.then(res => console.log(res))
.catch(err => console.error(err))
.finally(() => console.log('Bye!'));
λΉλκΈ° μ²λ¦¬μμ λ°μν μλ¬λ λ€μκ³Ό κ°μ΄ μλ¬ μ²λ¦¬νλ€.
promiseGet('https://jsonplaceholder.typicode.com/todos/1')
.then(res => console.xxx(res))
.catch(err => console.error(err)); // TypeError: console.xxx is not a function
then, catch, finally νμ μ²λ¦¬ λ©μλλ μΈμ λ νλ‘λ―Έμ€λ₯Ό λ°ννλ―λ‘ μ°μμ μΌλ‘ νΈμΆν μ μλ€. μ΄λ₯Ό νλ‘λ―Έμ€ μ²΄μ΄λμ΄λΌ νλ€.
νλ‘λ―Έμ€λ νλ‘λ―Έμ€ μ²΄μ΄λμ ν΅ν΄ λΉλκΈ° μ²λ¦¬ κ²°κ³Όλ₯Ό μ λ¬λ°μ νμ μ²λ¦¬λ₯Ό νλ―λ‘ λΉλκΈ° μ²λ¦¬λ₯Ό μν μ½λ°± ν¨ν΄μμ λ°μνλ μ½λ°± ν¬μ΄ λ°μνμ§ μλλ€. νμ§λ§ κ°λ
μ±μ΄ μ’μ§ μμΌλ―λ‘ asyncμ awaitλ₯Ό μ¬μ©ν΄ νλ‘λ―Έμ€μ νμ μ²λ¦¬ λ©μλ μμ΄ λ§μΉ λκΈ° μ²λ¦¬μ²λΌ νλ‘λ―Έμ€κ° μ²λ¦¬ κ²°κ³Όλ₯Ό λ°ννλλ‘ κ΅¬νν μ μλ€.
Promiseλ μ£Όλ‘ μμ±μ ν¨μλ‘ μ¬μ©λμ§λ§ ν¨μλ κ°μ²΄μ΄λ―λ‘ λ©μλλ₯Ό κ°μ§ μ μλ€. Promiseλ 5κ°μ§ μ μ λ©μλλ₯Ό μ 곡νλ€.
Promise.resolve/Promise.reject λ©μλλ μ΄λ―Έ μ‘΄μ¬νλ κ°μ λννμ¬ νλ‘λ―Έμ€λ₯Ό μμ±νκΈ° μν΄ μ¬μ©νλ€.
// λ°°μ΄μ resolveνλ νλ‘λ―Έμ€λ₯Ό μμ±
const resolvedPromise = Promise.resolve([1, 2, 3]);
resolvedPromise.then(console.log); // [1, 2, 3]
// μ μμ λ μλ μμ μ λμΌνκ² λμνλ€.
const resolvedPromise = new Promise(resolve => resolve([1, 2, 3]));
resolvedPromise.then(console.log); // [1, 2, 3]
// μλ¬ κ°μ²΄λ₯Ό rejectνλ νλ‘λ―Έμ€λ₯Ό μμ±
const rejectedPromise = Promise.reject(new Error('Error!'));
rejectedPromise.catch(console.log); // Error: Error!
// μ μμ λ μλ μμ μ λμΌνκ² λμνλ€.
// μλ¬ κ°μ²΄λ₯Ό rejectνλ νλ‘λ―Έμ€λ₯Ό μμ±
const rejectedPromise = Promise.reject(new Error('Error!'));
rejectedPromise.catch(console.log); // Error: Error!
Promiss.all λ©μλλ μ¬λ¬ κ°μ λΉλκΈ° μ²λ¦¬λ₯Ό λͺ¨λ λ³λ ¬ μ²λ¦¬ν λ μ¬μ©νλ€.
const requestData1 = () => new Promise(resolve => setTimeout(() => resolve(1), 3000));
const requestData2 = () => new Promise(resolve => setTimeout(() => resolve(2), 2000));
const requestData3 = () => new Promise(resolve => setTimeout(() => resolve(3), 1000));
// μΈ κ°μ λΉλκΈ° μ²λ¦¬λ₯Ό μμ°¨μ μΌλ‘ μ²λ¦¬
const res = [];
// 3μ΄ λ€μ resolve μν([]λΉ λ°°μ΄μ dataλ‘ μ λ¬λ°μ 1μ λ£μ κ·Έλ€μμ)
// 2μ΄ λ€μ resolve μν([1]λ°°μ΄μ dataλ‘ μ λ¬λ°μ 2μ λ£μ κ·Έλ€μμ)
// 1μ΄ λ€μ resolve μν([1, 2]λ°°μ΄μ dataλ‘ μ λ¬λ°μ 3μ λ£μ)
// μ½μλ‘κ·Έλ‘ λ°°μ΄ res([1, 2, 3]) μΆλ ₯ ν catchλ‘ μλ¬νΈλ€λ§
requestData1()
.then(data => {
res.push(data);
return requestData2();
})
.then(data => {
res.push(data);
return requestData3();
})
.then(data => {
res.push(data);
console.log(res); // [1, 2, 3] β μ½ 6μ΄ μμ
})
.catch(console.error);
μ μμ λ μΈ κ°μ λΉλκΈ° μ²λ¦¬λ₯Ό μμ²μ μΌλ‘ μ²λ¦¬νλ μλ‘ μμ‘΄νμ§ μκ³ κ°λ³μ μΌλ‘ μνλλ€.
const requestData1 = () => new Promise(resolve => setTimeout(() => resolve(1), 3000));
const requestData2 = () => new Promise(resolve => setTimeout(() => resolve(2), 2000));
const requestData3 = () => new Promise(resolve => setTimeout(() => resolve(3), 1000));
Promise.all([requestData1(), requestData2(), requestData3()])
.then(console.log) // [ 1, 2, 3 ] β μ½ 3μ΄ μμ
.catch(console.error);
Promise.all λ©μλλ νλ‘λ―Έμ€λ₯Ό μμλ‘ κ°λ λ°°μ΄ λ±μ μ΄ν°λ¬λΈμ μΈμλ‘ μ λ¬λ°μ μ λ¬λ°μ λͺ¨λ νλ‘λ―Έμ€κ° λͺ¨λ fulfilled μνκ° λλ©΄ λͺ¨λ μ²λ¦¬ κ²°κ³Όλ₯Ό λ°°μ΄μ μ μ₯ν΄ μλ‘μ΄ νλ‘λ―Έμ€λ₯Ό λ°ννλ€.
Promise.all λ©μλλ μΈμλ‘ μ λ¬λ°μ λ°°μ΄μ νλ‘λ―Έμ€κ° νλλΌλ rejected μνκ° λλ©΄ λλ¨Έμ§ νλ‘λ―Έμ€κ° fulfilled μνκ° λλκ²μ κΈ°λ€λ¦¬μ§ μκ³ μ¦μ μ’ λ£λλ€.
Promise.all([
new Promise((_, reject) => setTimeout(() => reject(new Error('Error 1')), 3000)),
new Promise((_, reject) => setTimeout(() => reject(new Error('Error 2')), 2000)),
new Promise((_, reject) => setTimeout(() => reject(new Error('Error 3')), 1000))
])
.then(console.log)
.catch(console.log); // Error: Error 3
Promise.all λ©μλλ μΈμλ‘ μ λ¬λ°μ μ΄ν°λ¬λΈμ μμκ° νλ‘λ―Έμ€κ° μλ κ²½μ° Promist.resolve λ©μλλ₯Ό ν΅ν΄ νλ‘λ―Έμ€λ‘ λννλ€.
Promise.race λ©μλλ Promise.all λ©μλμ λμΌνκ² νλ‘λ―Έμ€λ₯Ό μμλ‘ κ°λ λ°°μ΄ λ±μ μ΄ν°λ¬λΈμ μΈμλ‘ μ λ¬λ°μ κ°μ₯ λ¨Όμ fulfiled μνκ° λ νλ‘λ―Έμ€μ μ²λ¦¬ κ²°κ³Όλ₯Ό resolveνλ μλ‘μ΄ νλ‘λ―Έμ€λ₯Ό λ°ννλ€.
Promise.race([
new Promise(resolve => setTimeout(() => resolve(1), 3000)), // 1
new Promise(resolve => setTimeout(() => resolve(2), 2000)), // 2
new Promise(resolve => setTimeout(() => resolve(3), 1000)) // 3
])
.then(console.log) // 3
.catch(console.log);
νλ‘λ―Έμ€κ° rejected μνκ° λλ©΄ Promise.all λ©μλμ λμΌνκ² μ²λ¦¬λλ€.
Promise.race([
new Promise((_, reject) => setTimeout(() => reject(new Error('Error 1')), 3000)),
new Promise((_, reject) => setTimeout(() => reject(new Error('Error 2')), 2000)),
new Promise((_, reject) => setTimeout(() => reject(new Error('Error 3')), 1000))
])
.then(console.log)
.catch(console.log); // Error: Error 3
Promiss.allSettled λ©μλλ νλ‘λ―Έμ€λ₯Ό μμλ‘ κ°λ λ°°μ΄ λ±μ μ΄ν°λ¬λΈμ μΈμλ‘ μ λ¬λ°λλ€. κ·Έλ¦¬κ³ μ λ¬λ°μ νλ‘λ―Έμ€κ° λͺ¨λ settled μνκ° λλ©΄ μ²λ¦¬ κ²°κ³Όλ₯Ό λ°°μ΄λ‘ λ°ννλ€.
Promise.allSettled([
new Promise(resolve => setTimeout(() => resolve(1), 2000)),
new Promise((_, reject) => setTimeout(() => reject(new Error('Error!')), 1000))
]).then(console.log);
/*
[
{status: "fulfilled", value: 1},
{status: "rejected", reason: Error: Error! at <anonymous>:3:54}
]
*/
Promiss.allSettled λ©μλκ° λ°νν λ°°μ΄μλ fulfilled λλ rejected μνμλ μκ΄μμ΄ Promise.allSettled λ©μλκ° μΈμλ‘ μ λ¬λ°μ λͺ¨λ νλ‘λ―Έμ€λ€μ μ²λ¦¬ κ²°κ³Όκ° λͺ¨λ λ΄κ²¨ μλ€.
νλ‘λ―Έμ€μ νμ μ²λ¦¬ λ©μλμ μ½λ°±ν¨μλ νμ€ν¬ νκ° μλλΌ λ§μ΄ν¬λ‘νμ€ν¬ νμ μΌμμ μ₯λλ€.λ§μ΄ν¬λ‘νμ€ν¬ νλ νμ€ν¬νλ³΄λ€ μ°μ μμκ° λλ€. μ¦, μ΄λ²€νΈ 루νλ μ½ μ€νμ΄ λΉλ©΄ λ¨Όμ λ§μ΄ν¬λ‘νμ€ν¬ νμμ λκΈ°νκ³ μλ ν¨μλ₯Ό κ°μ Έμ μ€ννλ€. μ΄ν λ§μ΄ν¬λ‘νμ€ν¬ νκ° λΉλ©΄ νμ€ν¬ νμμ λκΈ°νκ³ μλ ν¨μλ₯Ό κ°μ Έμ μ€ννλ€.
fetch ν¨μλ XMLHttpRequest κ°μ²΄μ λ§μ°¬κ°μ§λ‘ HTTP μμ² μ μ‘ κΈ°λ₯μ μ 곡νλ ν΄λΌμ΄μΈνΈ μ¬μ΄λ Web APIλ€. fetch ν¨μλ XMLHttpRequest κ°μ²΄λ³΄λ€ μ¬μ©λ²μ΄ κ°λ¨νκ³ νλ‘λ―Έμ€λ₯Ό μ§μνκΈ° λλ¬Έμ λΉλκΈ° μ²λ¦¬λ₯Ό μν μ½λ°± ν¨ν΄μ λ¨μ μμ μμ λ‘λ€.
fetch ν¨μμλ HTTP μμ²μ μ μ‘ν URLκ³Ό HTTP μμ² λ©μλ, HTTP μμ² ν€λ, νμ΄λ‘λ λ±μ μ€μ ν κ°μ²΄λ₯Ό μ λ¬νλ€.
const promise = fetch(url [,options])
fetch ν¨μλ HTTP μλ΅μ λνλ΄λ Response κ°μ²΄λ₯Ό λνν Promise κ°μ²΄λ₯Ό λ°ννλ€.
fetch('https://jsonplaceholder.typicode.com/todos/1')
// responseλ HTTP μλ΅μ λνλ΄λ Response κ°μ²΄μ΄λ€.
// json λ©μλλ₯Ό μ¬μ©νμ¬ Response κ°μ²΄μμ HTTP μλ΅ λͺΈμ²΄λ₯Ό μ·¨λνμ¬ μμ§λ ¬ννλ€.
.then(response => response.json())
// jsonμ μμ§λ ¬νλ HTTP μλ΅ λͺΈμ²΄μ΄λ€.
.then(json => console.log(json));
// {userId: 1, id: 1, title: "delectus aut autem", completed: false}
fetch ν¨μλ HTTP μλ΅μ λνλ΄λ Response κ°μ²΄λ₯Ό λνν νλ‘λ―Έμ€λ₯Ό λ°ννλ―λ‘ νμ μ²λ¦¬ λ©μλ thenμ ν΅ν΄ νλ‘λ―Έμ€κ° resolve ν Response κ°μ²΄λ₯Ό μ λ¬λ°μ μ μλ€.
const wrongUrl = 'https://jsonplaceholder.typicode.com/XXX/1';
// λΆμ μ ν URLμ΄ μ§μ λμκΈ° λλ¬Έμ 404 Not Found μλ¬κ° λ°μνλ€.
fetch(wrongUrl)
.then(() => console.log('ok'))
.catch(() => console.log('error'));
fetch ν¨μκ° λ°ννλ νλ‘λ―Έμ€λ κΈ°λ³Έμ μΌλ‘ 404 Not Foundλ 500 Internal Server Errorμ κ°μ HTTP μλ¬κ° λ°μν΄λ μλ¬λ₯Ό rejectνμ§ μκ³ λΆλ¦¬μΈ νμ μ ok μνλ₯Ό falseλ‘ μ€μ ν Response κ°μ²΄λ₯Ό resolveνλ€. μ€νλΌμΈ λ±μ λ€νΈμν¬ μ₯μ λ CORS μλ¬μ μν΄ μμ²μ΄ μλ£λμ§ λͺ»ν κ²½μ°μλ§ νλ‘λ―Έμ€λ₯Ό rejectνλ€. λ°λΌμ λΆλ¦¬μΈνμ μ ok μνλ₯Ό λͺ μμ μΌλ‘ νμΈν νμκ° μλ€.
const wrongUrl = 'https://jsonplaceholder.typicode.com/XXX/1';
// λΆμ μ ν URLμ΄ μ§μ λμκΈ° λλ¬Έμ 404 Not Found μλ¬κ° λ°μνλ€.
fetch(wrongUrl)
// responseλ HTTP μλ΅μ λνλ΄λ Response κ°μ²΄λ€.
.then(response => {
if (!response.ok) throw new Error(response.statusText);
return response.json();
})
.then(todo => console.log(todo))
.catch(err => console.error(err));
fetch ν¨μλ₯Ό ν΅ν΄ HTTP μμ²μ μ μ‘ν μ μλ€.
const request = {
get(url) {
return fetch(url);
},
post(url, payload) {
return fetch(url, {
method: 'POST',
headers: { 'content-Type': 'application/json' },
body: JSON.stringify(payload)
});
},
patch(url, payload) {
return fetch(url, {
method: 'PATCH',
headers: { 'content-Type': 'application/json' },
body: JSON.stringify(payload)
});
},
delete(url) {
return fetch(url, { method: 'DELETE' });
}
};
request.get('https://jsonplaceholder.typicode.com/todos/1')
.then(response => {
if (!response.ok) throw new Error(response.statusText);
return response.json();
})
.then(todos => console.log(todos))
.catch(err => console.error(err));
// {userId: 1, id: 1, title: "delectus aut autem", completed: false}
request.post('https://jsonplaceholder.typicode.com/todos', {
userId: 1,
title: 'JavaScript',
completed: false
}).then(response => {
if (!response.ok) throw new Error(response.statusText);
return response.json();
})
.then(todos => console.log(todos))
.catch(err => console.error(err));
// {userId: 1, title: "JavaScript", completed: false, id: 201}
request.patch('https://jsonplaceholder.typicode.com/todos/1', {
completed: true
}).then(response => {
if (!response.ok) throw new Error(response.statusText);
return response.json();
})
.then(todos => console.log(todos))
.catch(err => console.error(err));
// {userId: 1, id: 1, title: "delectus aut autem", completed: true}
request.delete('https://jsonplaceholder.typicode.com/todos/1')
.then(response => {
if (!response.ok) throw new Error(response.statusText);
return response.json();
})
.then(todos => console.log(todos))
.catch(err => console.error(err));
// {}