An Overview of JavaScript Promises - Lee-hyuna/33-js-concepts-kr GitHub Wiki
μλ°μ€ν¬λ¦½νΈ νλΌλ―Έμ€μ κ°μ
μλ¬Έ : https://www.sitepoint.com/overview-javascript-promises/
μ΄ νν 리μΌμ μλ°μ€ν¬λ¦½νΈ νλΌλ―Έμ€μ κΈ°μ΄λ₯Ό λ€λ£¨λ©°, μλ°μ€ν¬λ¦½νΈ κ°λ°μμ μ΄λ₯Ό νμ©νλ λ°©λ²μ μλ €μ€λλ€.
μΉκ°λ°μμ νλΌλ―Έμ€ κ°λ μ μλ‘μ΄ κ²μ΄ μλλλ€. Q, wen.js, RSVP.js λ±λ± μμ μ΄λ―Έ λ§μ΄ μ¬μ©λμ΄μ Έ μμ΅λλ€. jQueryμμ μ‘°μ°¨λ νλΌλ―Έμ€μ λΉμ·ν Defferd κ°μ²΄λ₯Ό κ°μ§κ³ μμ΅λλ€. κ·Έλ¬λ μ΄μ μλ°μ€ν¬λ¦½νΈμμ νλΌλ―Έμ€λ₯Ό κΈ°λ³Έμ μΌλ‘ μ§μν©λλ€.
κ°μ
νλΌλ―Έμ€ κ°μ²΄λ μμ§ μ¬μ©ν μλ μμ§λ§ λμ€μ νΉμ μμ μμ ν΄κ²°λ (resolved) κ°μ λνλ λλ€. λ³΄λ€ λκΈ°μ μΈ λ°©μμΌλ‘ λΉλκΈ° μ½λλ₯Ό μμ±ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ λ§μ½ μΉμλΉμ€μμ λΉλκΈ° νΈμΆμ λ§λ€μ΄ λ΄κΈ° μν΄ νλΌλ―Έμ€ APIλ₯Ό μ¬μ©νλ κ²½μ°, λμ€μ μΉμλΉμ€μμ λ°νν λ°μ΄ν°μΈ νλΌλ―Έμ€ κ°μ²΄λ₯Ό λ§λλλ€. μ£Όμ μ¬νμ μ€μ λ°μ΄ν°λ₯Ό μμ§ μ¬μ©ν μ μλ€λ κ²μ λλ€. μμ²μ΄ μλ£λλ©΄ μΉμλΉμ€μ μλ΅μ΄ λ°νλ©λλ€. κ·Έλ¬λ λμ νλΌλ―Έμ€ κ°μ²΄λ μ€μ λ°μ΄ν°μ λν νλ‘μ μν μ ν©λλ€. λν μ½λ°±μ νλΌλ―Έμ€ κ°μ²΄μ 첨λΆν μ μμΌλ©° μ€μ λ°μ΄ν°λ₯Ό μ¬μ©ν μ μκ² λλ©΄ νΈμΆμ΄ λ©λλ€.
API
μμνκΈ° μν΄μ μλ‘μ΄ νλΌλ―Έμ€ κ°μ²΄λ₯Ό μμ±νλ λ€μ μ½λλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.:
const promise = new Promise((resolve, reject) => {
//asynchronous code goes here
});
μλ‘μ΄ νλΌλ―Έμ€ κ°μ²΄λ₯Ό μΈμ€ν΄μ€ννκ³ μ½λ°± ν¨μλ₯Ό μ λ¬νλ κ²μΌλ‘ μμν©λλ€. μ½λ°± ν¨μλ resolveμ reject ν¨μλ₯Ό λ μΈμλ‘ μ λ¬ ν©λλ€.
λΉλκΈ° μ½λλ ν΄λΉ μ½λ°±μ λ€μ΄κ°λλ€. λ§μ½ μ±κ³΅νλ€λ©΄ νλΌλ―Έμ€λ resolve()ν¨μλ₯Ό νΈμΆνκ³ , μ€λ₯κ° λ°μνλ©΄ reject() ν¨μκ° Errorκ°μ²΄μ ν¨κ» νΈμΆμ΄ λ©λλ€.
μ΄κ²μ νλΌλ―Έμ€κ° κ±°λΆ λμμμ λνλ λλ€.
νλΌλ―Έμ€λ₯Ό μ¬μ©ν κ°λ¨ν κ²μ λ§λ€μ΄ λ΄ μλ€. JSON ν¬λ§·μΌλ‘ λ°νλλ random jokeλ₯Ό μ¬μ©ν μΉμλΉμ€μ λΉλκΈ° μμ²μ ν©λλ€. μλμ μ½λμ νλΌλ―Έμ€λ₯Ό μ¬μ©ν μλ₯Ό λ³Ό μ μμ΅λλ€.:
const promise = new Promise((resolve, reject) => {
const request = new XMLHttpRequest();
request.open('GET', 'https://api.icndb.com/jokes/random');
request.onload = () => {
if (request.status === 200) {
resolve(request.response); // we got data here, so resolve the Promise
} else {
reject(Error(request.statusText)); // status is not 200 OK, so reject
}
};
request.onerror = () => {
reject(Error('Error fetching data.')); // error occurred, reject the Promise
};
request.send(); // send the request
});
console.log('Asynchronous request made.');
promise.then((data) => {
console.log('Got data! Promise fulfilled.');
document.body.textContent = JSON.parse(data).value.joke;
}, (error) => {
console.log('Promise rejected.');
console.log(error.message);
});
μ΄μ μ½λμμ νλΌλ―Έμ€ μμ±μλ μΉμλΉμ€λ‘ λΆν° λ°μ΄ν°λ₯Ό κ°μ Έμ€λλ° μ¬μ©λλ λΉλκΈ° μ½λλ₯Ό ν¬ν¨κ° ν¬ν¨λμ΄ μμ΅λλ€.
μ¬κΈ°μμ, https://api.icndb.com/jokes/randomμ Ajax μμ²μΌλ‘ μμ±νμ¬ random jokeλ₯Ό λ°νν©λλ€. JSONμ΄ μΉμλ²λ‘ λΆν° μλ΅ λ°μΌλ©΄, μ΄κ²μ resolve() ν¨μλ‘ λ³΄λ΄μ§λλ€. λ§μ½ μ΄λ μ€λ₯λΌλ λ°μνλ€λ©΄ reject()λ Error κ°μ²΄μ ν¨κ» νΈμΆμ΄ λ©λλ€.
νλΌλ―Έμ€ μ€λΈμ νΈκ° μΈμ€ν΄μ€ν λμμ λ, λμ€μ μ¬μ©κ°λ₯ν λ°μ΄ν°λ₯Ό νλ‘μλ‘ λΆν° λ°μ΅λλ€. μμΌλ‘ μ΄λ μμ μ μΉμλΉμ€μμ μΌλΆ λ°μ΄ν°κ° λ°ν λ κ²μ΄λΌκ³ κΈ°λνκ³ μμ΅λλ€. κ·Έλμ μ΄λ»κ² μΈμ μ¬μ© κ°λ₯ν λ°μ΄ν°μΈμ§ μ μ μμκΉμ? μΈμ μ¬μ© κ°λ₯ν λ°μ΄ν°μΈμ§ μλ κ²μ Promise.then() ν¨μλ₯Ό μ¬μ©νλ κ²μ λλ€. ν¨μλ μ±κ³΅ν κ²½μ°μ μ½λ°± ν¨μμ μ€ν¨ν κ²½μ°μ μ½λ°±ν¨μμΈ 2κ°μ μΈμλ₯Ό κ°μ§λλ€. μ΄λ€ μ½λ°±ν¨μλ νλΌλ―Έμ€κ° μ ν΄μ§λ©΄ (μ¦, μ€ν λλ κ±°λΆ) νΈμΆμ΄ λ©λλ€. λ§μ½ νλΌλ―Έμ€κ° μ€νμ΄ λμ΄ μ§λ€λ©΄ μ±κ³΅ν μ½λ°±μ resolve()μ μ λ¬ν μ€μ λ°μ΄ν°λ₯Ό λ°μ μ μμ΅λλ€. λ§μ½ νλΌλ―Έμ€κ° κ±°λΆ λλ€λ©΄ μ€ν¨ν μ½λ°±μ΄ νΈμΆ λ©λλ€. reject() ν¨μκ° μ λ¬ν κ²μ μ½λ°±μ μΈμλ‘ μ λ¬λ©λλ€.
μ½λνμ μμ μ λλ€. μλ‘μ΄ random jokeλ₯Ό λ³΄λ €λ©΄ μ½λνμ΄ μ½μ λ νλ©΄μμ μ€λ₯Έμͺ½ νλ¨μ μλ RETURN λ²νΌμ λλ₯΄μΈμ. λν μ½λμ λ€λ₯Έ λΆλΆμ΄ μ€νλλ μμλ₯Ό λ³Ό μ μλλ‘ λΈλΌμ°μ μ½μμ μ΄μ΄μ£ΌμΈμ.
const promise = new Promise((resolve, reject) => {
const request = new XMLHttpRequest();
request.open("GET", "https://api.icndb.com/jokes/random");
request.onload = () => {
if (request.status === 200) {
resolve(request.response);
} else {
reject(Error(request.statusText));
}
};
request.onerror = () => {
reject(Error("Error fetching data."));
};
request.send();
});
console.log("Asynchronous request made.");
promise.then(
data => {
console.log("Got data! Promise fulfilled.");
document.body.textContent = JSON.parse(data).value.joke;
},
error => {
console.log("Promise rejected.");
console.log(error.message);
}
);
νλΌλ―Έμ€μλ μΈ κ°μ§ μνκ° μμ μ μμ΅λλ€.:
- 보λ₯μ€ (μ€νλ μλκ³ κ±°λΆλ μλ)
- μ€ν
- κ±°λΆ
μ½λμμ μ κ·Όν μ μκ³ λΉκ³΅κ°μΈ Promise.status μμ±μ μ΄λ λ μνμ λν μ 보λ₯Ό μ 곡ν©λλ€. νλΌλ―Έμ€κ° κ±°λΆλκ±°λ μ€νλλ©΄ μνλ μꡬμ μΌλ‘ μ°κ΄μ΄ λμ΄ μ§λλ€. μ΄ μλ―Έλ νλΌλ―Έμ€λ ν λ²λ§ μ±κ³΅νκ±°λ μ€ν¨ν μ μμμ μλ―Έν©λλ€. λ§μ½ νλΌλ―Έμ€κ° μ΄λ―Έ μ€νλμκ³ λμ€μ λ κ°μ μ½λ°±μΌλ‘ then()μ 첨λΆνλ©΄ μ±κ³΅ μ½λ°±μ΄ μ¬λ°λ₯΄κ² νΈμΆλ©λλ€. κ·Έλμ νλΌλ―Έμ€μ μΈκ³μμλ νλΌλ―Έμ€κ° μΈμ μ ν΄μ§λμ§μ κ΄μ¬μ΄ μμ΅λλ€. νλΌλ―Έμ€λ μ΅μ’ κ²°κ³Όμλ§ κ΄μ¬μ΄ μμ΅λλ€.
νλΌλ―Έμ€ 체μ΄λ
κ°λμ©μ νλΌλ―Έμ€λ₯Ό 체μ΄λνλ κ²μ΄ λ°λμ§ν©λλ€. μλ₯Ό λ€μ΄ μ¬λ¬ λΉλκΈ° μμ μ μνν λ μ λλ€. ν μμ μμ λ°μ΄ν°λ₯Ό μ 곡νλ©΄ ν΄λΉ λ°μ΄ν° λ±μμ λ€λ₯Έ μμ μ μννκΈ° μμν©λλ€. νλΌλ―Έμ€λ μλμ μμ μ½λμμ μ²λΌ ν¨κ» λ¬Άμ μ μμ μ μμ΅λλ€.
function getPromise(url) {
// return a Promise here
// send an async request to the url as a part of promise
// after getting the result, resolve the promise with it
}
const promise = getPromise('some url here');
promise.then((result) => {
//we have our result here
return getPromise(result); //return a promise here again
}).then((result) => {
//handle the final result
});
κΉλ€λ‘μ΄ λΆλΆμ then()μμ κ°λ¨ν κ°μ λ°ννλ©΄ κ·Έ λ€μ λ°ν κ°μΌλ‘ λ€μ then()μ΄ νΈμΆλλ€λ κ²μ λλ€. κ·Έλ¬λ λ§μ½ then()μμ νλΌλ―Έμ€λ₯Ό λ°ννλ©΄ λ€μ then()κ° κ·Έ νλΌλ―Έμ€λ₯Ό κΈ°λ€λ Έλ€κ° κ·Έ νλΌλ―Έμ€κ° μ ν΄μ§λ©΄ νΈμΆμ΄ λ©λλ€.
μλ¬ νΈλ€λ§
then()ν¨μλ λ κ°μ μ½λ°±μ μΈμλ‘ λ°λλ€λ κ²μ μκ³ μμ΅λλ€. νλΌλ―Έμ€κ° κ±°λΆλλ©΄ λλ²μ§Έ νλΌλ―Έμ€κ° νΈμΆμ΄ λ κ²μ λλ€. κ·Έλ¬λ νλΌλ―Έμ€λ₯Ό κ±°λΆλ₯Ό μ²λ¦¬νλ λ° μ¬μ©ν μ μλ catch()ν¨μλ μμ΅λλ€. λ€μ μ½λλ₯Ό μ΄ν΄λ³΄μμμ€.
promise.then((result) => {
console.log('Got data!', result);
}).catch((error) => {
console.log('Error occurred!', error);
});
μμ μ½λλ μλμ μ½λμ κ°μ΅λλ€.
promise.then((result) => {
console.log('Got data!', result);
}).then(undefined, (error) => {A
console.log('Error occurred!', erroAr);
});
νλΌλ―Έμ€κ° κ±°λΆλμκ³ then()μ μ€ν¨ μ½λ°±μ΄ μμΌλ©΄, μ μ΄λ μ€ν¨ μ½λ°± λλ λ€μ catch() κ·Έλ€μ thenμΌλ‘ μ§νμ΄ λ©λλ€. λͺ μμ μ νλΌλ―Έμ€ κ±°λΆμ λ¬λ¦¬ catch()λ νλΌλ―Έμ€ μμ±μ μ½λ°±μμ μμΈκ° λ°μνλ©΄ νΈμΆλ©λλ€. κ·Έλμ λ‘κ·Έ κΈ°λ‘μ μν΄ catch()λ₯Ό μ¬μ©ν©λλ€. try...catchλ₯Ό μ¬μ©νμ¬ μ€λ₯λ₯Ό μ²λ¦¬ν μ μμ§λ§ λΉλκΈ° λλ λκΈ° μ€λ₯λ 'catch()'μ μν΄ μ‘νλ―λ‘ νλΌλ―Έμ€μλ νμνμ§ μμ΅λλ€.
κ²°λ‘
μλ°μ€ν¬λ¦½νΈμ μλ‘μ΄ νλΌλ―Έμ€ APIλ₯Ό μκ°νμμ΅λλ€. λΆλͺ ν λΉλκΈ° μ½λλ₯Ό λ§€μ° μ½κ² μμ±ν μ μμ΅λλ€. λμ€μ λΉλκΈ° μ½λμμ μ΄λ€ κ°μ΄ λ°νλ μ§ λͺ¨λ₯Έ μ± νμλλ‘ μ§νν μλ μμ΅λλ€. μ¬κΈ°μμ λ€λ£¨μ§ μμ APIκ° λ μμ΅λλ€. νλΌλ―Έμ€μ μ’ λ λ§μ λ΄μ©μ λ°°μ°κΈ° μνλ€λ©΄ A Deeper Dive Into JavaScript Promises κΈμ μ’ λ νμΈνμΈμ.