PROMISE
์์ ๊ธ์ ์ฝ๋ฐฑ ์ง์ฅ ์ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ ์ค ํ๋๋ก Promise ํจํด์ด ์ ์๋์๋ค.
jQuery์์๋ ์์ ํ์ง ์์ง๋ง Promiseํจํด์ด Deferred ๋ก ์ฌ์ฉ๋๊ณ ์๋ค.
Promise ํจํด์ ์ฌ์ฉํ๋ฉด 1. ๋น๋๊ธฐ ์์ ๋ค์ ์์ฐจ์ ์ผ๋ก ์งํํ๊ณ ๋, ๋ณ๋ ฌ๋ก ์งํํ๋ ๋ฑ์ ์ ์ด๊ฐ ์์ํด์ง๊ณ 2. ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ์ข์์ง๋ค. ๋ํ ๋ด๋ถ์ ์ผ๋ก ์์ธ์ฒ๋ฆฌ์ ๋ํ ๊ตฌ์กฐ๊ฐ ํํํด, ์ค๋ฅ ๋ฐ์ ์ 3. ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํด ๋ณด๋ค ์ง๊ด์ ์ผ๋ก ๊ด๋ฆฌํด์ค ์ ์๋ ์ฅ์ ์ด ์๋ค.
Promise๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์ฑ๊ณต(fulfilled)ํ๋์ง, ์คํจ(rejected)ํ๋์ง ๋ฑ์ ์ํ ์ ๋ณด์ ์ฒ๋ฆฌ ์ข ๋ฃํ ์คํ๋ ์ฝ๋ฐฑํจ์(then, catch)๋ฅผ ๋ด๊ณ ์๋ ๊ฐ์ฒด์ด๋ค.
Promise๋ ์ฃผ๋ก ์๋ฒ์์ ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ ํ๋ฉด์ ํ์ํ ๋ ์ฌ์ฉํ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌํํ ๋ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ ๋ฐ์์ค๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ๋ค.
var _promise = function(param){
return new Promise(function (){
// setTimeoutํจ์๋ก ๋น๋๊ธฐ
window.setTimeout(function(){
if(param){
resolve("ํด๊ฒฐ์๋ฃ");
}else{
reject(Error("์คํจ"));
}
},30000);
});
};
//promise ์คํ
_promise(true).then(function(text){
console.log(text);
},function(error){
console.error(error);
});
//=> "ํด๊ฒฐ ์๋ฃ"
function getData(callback) {
// new Promise()
return new Promise(function (resolve, reject) {
$.get('url ์ฃผ์/products/1', function (response) {
resolve(response); // ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ผ๋ฉด resolve()
});
});
}
// getData()์ ์คํ์ด ๋๋๋ฉด ํธ์ถ๋๋ then()
getData().then(function (data) {
// resolve()์ ๊ฒฐ๊ณผ ๊ฐ์ด ์ ๋ฌ๋๋ค.
console.log(data); // $.get()์ reponse ๊ฐ์ด tableData์ ์ ๋ฌ๋จ
});
์์ ์ฝ๋๋ Promise ์ ์ธ๊ณผ ์คํ ๋ ๋ถ๋ถ์ผ๋ก ๋๋ ์ ์๋ค.
Promise์ states
Promise๋ ์ฌ์ ์ ์๋ฏธ๋ก "์ฝ์"์ด๋ค. js์์๋ "์ง๊ธ์ ์๋๋ฐ ์ด์์์ผ๋ฉด ์ด๋ฐ๊ฐ ์ฃผ๊ณ ์์ผ๋ฉด ์๋ ค์ค๊ฒ"๋ผ๋ ์ฝ์์ผ๋ก ๋ณผ ์ ์๋ค. ๋ฐ๋ผ์ promise๋ ๋ค์๊ณผ ๊ฐ์ ์ํ(state)๋ฅผ ๊ฐ์ง๋ค.
pending(๋๊ธฐ) : ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ก์ง์ด ์์ง ์๋ฃ๋์ง ์์ ์ํ. (์ฝ์์ ์ํ ์ค์ธ ์ํ)
fulfilled(์ดํ) : ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋์ด promise๊ฐ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐํํด์ค ์ํ. (์ฝ์์ด ์ง์ผ์ง ์ํ)
rejected(์คํจ) : ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์คํจํ๊ฑฐ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ํ(์ฝ์์ด ๋ชป ์ง์ผ์ง ์ํ)
settled : ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์คํจ์ด๋ ์ฑ๊ณต์ด๋ ๊ฒฐ๋ก ์ด ๋ ์ํ์ด๋ค.
๊ฐ ์ํ๋ฅผ ์ฐจ๋ก๋๋ก ์ดํด๋ณด์.
Pending
new Promise();
๋ค์๊ณผ ๊ฐ์ด new Promise()
๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด pending ์ํ๊ฐ ๋๋ค.
new Promise(function(resolve, reject){
//...
});
๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์ฝ๋ฐฑ ํจ์์ ์ธ์๋ก resolve, reject ์ ์ ๊ทผ ํ ์ ์๋ค.
promsie๊ฐ ์์ฑ๋ ์งํ๋ถํฐ resolve๋ reject๊ฐ ํธ์ถ๋๊ธฐ ์ ๊น์ง์ ์ํ์ด๋ค.
Fulfilled
new Promise(function(resolve, reject){
resolve();
});
์ฝ๋ฐฑ ํจ์์ ์ธ์์ธ resolve๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์คํํ๋ฉด fulfilled(์ดํ) ์ํ๊ฐ ๋๋ค. fulfilled์ํ๊ฐ ๋๋ฉด ์๋์ ๊ฐ์ด then()
์ ์ด์ฉํด ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐ์ ์ ์๋ค.
function getData(){
return new Promise(function(resolve, reject){
var data = 100;
resolve(data);
});
}
getData().then(function(resolvedData){
console.log(resolvedData);
});
//=> 100
Rejected
new Promise(function(resolve,reject){
reject();
});
์ฝ๋ฐฑ ํจ์ ์ธ์์ธ reject๋ก reject()
๋ฉ์๋๋ฅผ ์คํํ๋ฉด rejected(์คํจ) ์ํ๊ฐ๋๋ค. rejected ์ํ๊ฐ ๋๋ฉด ์คํจํ ์ด์ (์คํจ ์ฒ๋ฆฌ์ ๊ฒฐ๊ณผ ๊ฐ)๋ฅผ ์๋์ ๊ฐ์ด catch()
๋ก ๋ฐ์ ์ ์๋ค.
function getData(){
return new Promise(function(resolve,reject){
reject(new Error("Request is failed"));
});
}
getData.then().catch(function(err){
console.log(err);
});
//=> "Request is failed"
์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ catch()
๋ง๊ณ then()
๋ง์ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌํ ์๋ ์๋ค.
getData.then(function(){
// ์ฑ๊ณต...
},function(err){
console.log(err);
});
๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ง๋ง ๊ฐ๊ธ์ ์ด๋ฉด catch ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. ์๋ํ๋ฉด then()์ ๋๋ฒ์งธ ์ธ์๋ก๋ ๋ค์ ์์์ ๊ฐ์ด ์ค๋ฅ๋ฅผ ๊ฐ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
function getData(){
return new Promise(function(resolve,reject){
resolve('hi');
});
}
getData.then(function(result){
console.log(result);
throw new Error("Error in then() ์ธ์ง ๋ชปํ๋ ์ค๋ฅ");
},function(err){
console.log('then error : ',error);
});
๋ ๋ง์ ์์ธ ์ฒ๋ฆฌ ์ํฉ์ ์ํด์๋ catch()๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
์์
function getData(){
return new Promise(function(resolve, reject){
$.get(url,function(response){
if(response){
resolve(response);
}
reject(new Error("Request is failed"));
});
});
}
getData().then(function(data){
console.log(data);
}).catch(function(err){
console.log(err);
})
์์ ์ฝ๋๋ ์๋ฒ์์ ์๋ต์ ์ ๋๋ก ๋ฐ์์ค๋ฉด resolve() ๋ฉ์๋ ํธ์ถ, ์๋ต์ด ์์ผ๋ฉด reject() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ์์ ์ด๋ค. ํธ์ถ๋ ๋ฉ์๋์ ๋ฐ๋ผ then()์ด๋ catch()๋ก ๋ถ๊ธฐํ์ฌ ๊ฒฐ๊ณผ๊ฐ์ ์ถ๋ ฅํ๋ค.
Promise Chaining
์ฌ๋ฌ๊ฐ์ Promise ์ฌ๋ฌ๊ฐ๋ฅผ ์ฐ๊ฒฐํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
function getData(){
return new Promise({
//...
});
}
getData().then(function(data){
//...
}).then(function(){
//...
}).then(function(){
//...
});
๋ค์๊ณผ ๊ฐ์ด then()
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ฌ๋ฌ๊ฐ๋ฅผ ์ฐ๊ฒฐ ํ ์ ์๋ค.
์์
new Promise(function(resolve, reject){
setTimeout(function(){
resolve(1);
},2000);
})
.then(function(result){
console.log(result); //=>1
return result+10;
})
.then(function(result){
console.log(result); //=>11
return result+10;
})
.then(function(result){
console.log(result); //=>21
});
์ค๋ฌด์์ ์์ ๋ฒํ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฐ์์ ํ์ฑ, ์ธ์ฆ ๋ฑ์ ์์ ์ ๊ฑฐ์น๋ ์ฝ๋๋ฅผ ์ดํด๋ณผ ๊ฒ์ด๋ค.
var userInfo = {
id: 'test@xx.xxx',
pw: '11111'
};
function parseValue(){
return new Promise({
//...
});
}
function auth(){
return new Promise({
//...
});
}
function display(){
return new Promise({
//...
});
}
getData(userInfo)
.then(parseValue)
.then(auth)
.then(display);
๋ค์๊ณผ ๊ฐ์ด ์ฌ๋ฌ๊ฐ์ ํ๋ก๋ฏธ์ค๋ฅผ .then()
์ผ๋ก ์ฐ๊ฒฐํ์ฌ ์ฒ๋ฆฌํ ์ ์๋ค.
Promise.all
์ฌ๋ฌ๊ฐ์ ๋น๋๊ธฐ ์์ ๋ค์ด ์กด์ฌํ๊ณ ๊ทธ ์์ ๋ค์ด ๋ชจ๋ ์๋ฃ๋์์ ๋ ๋ค์ ์์ ์ ์งํํ๊ณ ์ถ์ ๊ฒฝ์ฐ์ ํ์ฉํ๋ฉด๋๋ค.
var _promise = new Promise(function(resolve, reject){
window.setTimeout(function(){
console.log("ํด๊ฒฐ");
resolve("first");
},Math.random()*20000+1000);
});
var _promise2 = new Promise(function(resolve, reject){
window.setTimeout(function(){
console.log("ํด๊ฒฐ2");
resolve("second");
},Math.random()*10000+1000);
});
Promise.all([_promise, _promise2]).then(function(values){
console.log("๋ชจ๋ ์๋ฃ",values);
});
//=> "ํด๊ฒฐ2"
//=> "ํด๊ฒฐ"
//=> "๋ชจ๋ ์๋ฃ"
์ฐธ์กฐํ์ด์ง
Last updated
Was this helpful?