javascript promises for dummies - Lee-hyuna/33-js-concepts-kr GitHub Wiki
Javascript ํ๋ผ๋ฏธ์ค
์๋ฌธ: JavaScript Promises for Dummies
์๋ฐ์คํฌ๋ฆฝํธ ํ๋ผ๋ฏธ์ค๋ ์ด๋ ต์ง ์๋ค. ๊ทธ๋ฌ๋ ๋ง์ ์ฌ๋๋ค์ ์ฒ์์ ์ดํดํ๊ธฐ๊ฐ ์กฐ๊ธ ์ด๋ ต๋ค๋ ๊ฒ์ ์๋ค. ๋ฐ๋ผ์ ํ๋ผ๋ง์ค๋ฅผ ์ดํดํ๋ ๋ฐฉ๋ฒ์ ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ผ๋ก ์ ์ผ๋ ค ํ๋ค.
ํ๋ผ๋ฏธ์ค ์ดํดํ๊ธฐ
ํ๋ผ๋ฏธ์ค๋ ๊ฐ๋จํ ๋งํด์ ์๋์ ๊ฐ๋ค.
"๋น์ ์ด ์ด๋ฆฐ์์ด๋ผ๊ณ ์์ํด๋ณด์. ์๋ง๊ฐ ๋ค์ ์ฃผ์ ์๋ก์ด ํด๋์ ํ๋ฅผ ์ฌ์ฃผ๊ฒ ๋ค๊ณ ์ฝ์(promise) ํ๋ค"
๋ค์ ์ฃผ๊ฐ ๋๊ธฐ์ ๊น์ง ํด๋์ ํ๋ฅผ ๋ฐ์ ์ ์์์ง ์์๊ฐ ์๋ค. ์๋ง๊ฐ ์ ๋ง๋ก ์ ํด๋์ ํ๋ฅผ ์ฌ์ค ์๋ ์๊ณ , ์ฌ์ฃผ์ง ์๊ณ ๋ณด๋ฅํ ์๋ ์๋ค.
์ด๊ฒ ๋ฐ๋ก ํ๋ผ๋ฏธ์ค์ด๋ค. ํ๋ผ๋ฏธ์ค๋ 3๊ฐ์ง์ ์ํ ๊ฐ์ ๊ฐ์ง๋ค.
- Pending: ์๋ก์ด ํด๋์ ํ๋ฅผ ๋ฐ์์ง๋ ๋ชจ๋ฅด๋ ์ํ
- Fulfilled: ์๋ง๊ฐ ์๋ก์ด ํด๋์ ํ๋ฅผ ์ฌ์ค ์ํ
- Rejected: ์๋ง๊ฐ ๊ตฌ๋งค๋ฅผ ๋ณด๋ฅํ ์ํ
ํ๋ผ๋ฏธ์ค ๋ง๋ค๊ธฐ
์, ์ด์ ์ด๊ฒ๋ค์ ์ค์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๊ตฌํํด ๋ณด์.
/_ ES5 _/
var isMomHappy = false;
// Promise
var willIGetNewPhone = new Promise(
function (resolve, reject) {
if (isMomHappy) {
var phone = {
brand: 'Samsung',
color: 'black'
};
resolve(phone); // fulfilled
} else {
var reason = new Error('mom is not happy');
reject(reason); // reject
}
}
);
์ด ์ฝ๋๋ ์ด ์์ฒด๋ก ๊ฝค ํํ๋ ฅ์ด ์๋ค.
// ํ๋ผ๋ฏธ์ค ๊ตฌ๋ฌธ์ ์๋์ ๊ฐ๋ค.
new Promise(function (resolve, reject) { ... } );
ํ๋ผ๋ฏธ์ค ์ฌ์ฉํ๊ธฐ
์ด์ ํ๋ผ๋ฏธ์ค๋ฅผ ์ป์์ผ๋, ์ฌ์ฉํด ๋ณด์. ์์ ์์ ์ ์ด์ด์ง๋ค.
/_ ES5 _/
...
// call our promise
var askMom = function () {
willIGetNewPhone
.then(function (fulfilled) {
// ์๋ก์ด ํด๋์ ํ๊ฐ ์๊ฒผ๋ค!
console.log(fulfilled);
// output: { brand: 'Samsung', color: 'black' }
})
.catch(function (error) {
// ์ด๋ฐ, ์๋ง๊ฐ ์ฌ์ฃผ์ง ์์์ด..
console.log(error.message);
// output: 'mom is not happy'
});
};
askMom();
์์ ๋ฅผ ๋๋ ค๋ณด๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด ๋ณด์!
Demo: https://jsbin.com/nifocu/1/edit?js,console
ํ๋ผ๋ฏธ์ค ์ฒด์ด๋
ํ๋ผ๋ฏธ์ค๋ chainableํ๋ค. ์ด์ด์ ํธ์ถ์ด ๊ฐ๋ฅํ๋ค๋ ์ด์ผ๊ธฐ์ด๋ค.
๋ค์ ์์ํด๋ณด์. ๋น์ ์ ์ด๋ฆฐ์์ด์ด๊ณ , ์น๊ตฌ์๊ฒ ์๋ง๊ฐ ์๋ก์ด ํด๋์ ํ๋ฅผ ์ฌ์ฃผ๋ฉด ๋ณด์ฌ์ฃผ๊ฒ ๋ค๊ณ ์ฝ์ํ๋ค.
์ด์ ๋๋ค๋ฅธ ํ๋ผ๋ฏธ์ค๊ฐ ์๊ฒผ๋ค. ์์ฑํด๋ณด์.
...
// 2nd promise
var showOff = function (phone) {
return new Promise(
function (resolve, reject) {
var message = 'Hey friend, I have a new ' +
phone.color + ' ' + phone.brand + ' phone';
resolve(message);
}
);
};
์ถ์ฝํ์๋ฉด :
// ์์ ์์ ๋ฅผ ์ถ์ฝํด๋ณด์
...
// 2nd promise
var showOff = function (phone) {
var message = 'Hey friend, I have a new ' +
phone.color + ' ' + phone.brand + ' phone';
return Promise.resolve(message);
};
ํ๋ผ๋ฏธ์ค๋ฅผ ์ฒด์ด๋ ํด๋ณด์. willIGetNewPhone
ํ๋ผ๋ฏธ์ค ํ์ showOff
ํ๋ผ๋ฏธ์ค๋ฅผ ์ดํํ ํ ๊ฒ์ด๋ค.
...
// ์ฐ๋ฆฌ์ ํ๋ผ๋ฏธ์ค๋ฅผ ํธ์ถํด๋ณด์.
var askMom = function () {
willIGetNewPhone
.then(showOff) // chain it here
.then(function (fulfilled) {
console.log(fulfilled);
// output: 'Hey friend, I have a new black Samsung phone.'
})
.catch(function (error) {
// ์ด๋ฐ, ์๋ง๊ฐ ์ฌ์ฃผ์ง ์์์ด..
console.log(error.message);
// output: 'mom is not happy'
});
};
์ผ๋ง๋ ํ๋ผ๋ฏธ์ค๋ฅผ ์ฒด์ด๋ํ๋๊ฒ ์ฌ์ด์ง ์๊ฒ ๋๊ฐ?
ํ๋ผ๋ฏธ์ค๋ ๋น๋๊ธฐ
ํ๋ผ๋ฏธ์ค๋ ๋น๋๊ธฐ์ด๋ค. ์ฐ๋ฆฌ๊ฐ ํ๋ผ๋ฏธ์ค๋ฅผ ํธ์ถ ํ๊ธฐ ์ ๊ณผ ํ์ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ๋ณด์.
// ํ๋ผ๋ฏธ์ค๋ฅผ ํธ์ถ
var askMom = function () {
console.log('์๋ง์๊ฒ ๋ฌป๊ธฐ ์ '); // log before
willIGetNewPhone
.then(showOff)
.then(function (fulfilled) {
console.log(fulfilled);
})
.catch(function (error) {
console.log(error.message);
});
console.log('์๋ง์๊ฒ ๋ฌผ์ ํ'); // log after
}
์์ ์ถ๋ ฅ ์์๋ ์ด๋ ํ๊ฐ? ์๋ง๋ ๋ค์์ ์์ํ ๊ฒ์ด๋ค.
1. before asking Mom
2. Hey friend, I have a new black Samsung phone.
3. after asking mom
๊ทธ๋ฌ๋ ์ค์ ์ถ๋ ฅ ์์๋ ์๋์ ๊ฐ๋ค.
1. before asking Mom
2. after asking mom
3. Hey friend, I have a new black Samsung phone.
์ ๊ทธ๋ด๊น? ์ธ์์ ์ฌ๋์ ๊ธฐ๋ค๋ ค์ฃผ์ง ์๋๋ค.
์ด๋ฆฐ์์ด๋ ์๋ง๊ฐ ์ฝ์(์๋ก์ด ํด๋์ ํ)์ ์งํฌ๋ ๊น์ง ๊ธฐ๋ค๋ฆฌ๋ฉด์ ๊ฐ๋งํ ์์ง ์๋๋ค. ๊ทธ๋ ์ง? ์ด ๊ฒ์ ๋น๋๊ธฐ๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ด๋ค. ํ๋ผ๋ฏธ์ค๊ฐ ์งํ ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผํ๋ ๊ฒ์ then
์ ๋ฃ์ด์ผ ํ๋ค.
ES5, ES6/2015, ES7/Next ์ ํ๋ผ๋ฏธ์ค
ES5 - ๋ค์์ ๋ธ๋ผ์ฐ์
Bluebird ํ๋ผ๋ฏธ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ include ํ๋ฉด, ์์ ๋ค์ ES5 ํ๊ฒฝ์์ ๋์ํ ๊ฒ์ด๋ค. ES5๋ ํ๋ผ๋ฏธ์ค๋ฅผ ์ง์ํ์ง ์๋๋ค. ๋๋ค๋ฅธ ์ ๋ช ํ ํ๋ผ๋ฏธ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ Q์ด๋ค.
ES6 / ES2015 - ๋ชจ๋ ๋ธ๋ผ์ฐ์ , NodeJs v6
์์ ๋ค์ ์ ๋์ํ ๊ฒ์ด๋ค. ES6๋ ์์ฒด์ ์ผ๋ก ํ๋ผ๋ฏธ์ค๋ฅผ ์ง์ํ๋ค. ์ถ๊ฐ๋ก ES6์์ const
์ let
์ ์ด์ฉํ์ฌ ํจ์๋ฅผ ํ์ดํ๋ก ์ด์ฉํ์ฌ ํํํ ์ ์๋ค.
์ฌ๊ธฐ ES6 ์์ ์ฝ๋๊ฐ ์๋ค.
/_ ES6 _/
const isMomHappy = true;
// Promise
const willIGetNewPhone = new Promise(
(resolve, reject) => { // fat arrow
if (isMomHappy) {
const phone = {
brand: 'Samsung',
color: 'black'
};
resolve(phone);
} else {
const reason = new Error('mom is not happy');
reject(reason);
}
}
);
const showOff = function (phone) {
const message = 'Hey friend, I have a new ' +
phone.color + ' ' + phone.brand + ' phone';
return Promise.resolve(message);
};
// call our promise
const askMom = function () {
willIGetNewPhone
.then(showOff)
.then(fulfilled => console.log(fulfilled)) // fat arrow
.catch(error => console.log(error.message)); // fat arrow
};
askMom();
๋ชจ๋ var
๋ค์ const
๋ก ๋์ฒด๋์๋ค. ๋ชจ๋ function(resolve, reject)
๋ ๋จ์ํ๊ฒ (resolve, reject) =>
๋ก ๋ณํ๋ค.
ES7 - Async Await: ์ฝ๋๊ฐ ๋ ์์๊ฒ ๋ณด์ด๋๋ก ๋ง๋ค๊ธฐ
ES7๋ async
๋ฐ await
๊ตฌ๋ฌธ์ ์๊ฐํ๋ค. ์ด ๊ฒ๋ค์ .then
ํ๊ณ .catch
๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋น๋๊ธฐ ๊ตฌ๋ฌธ์ ์ด์๊ฒ ๋ณด์ด๊ฒ ํ๋ฉฐ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ ๋ค.
์ฐ๋ฆฌ์ ์์ ๋ฅผ ES7 ๊ตฌ๋ฌธ์ผ๋ก ๋ง๋ค์ด ๋ณด์.
/_ ES7 _/
const isMomHappy = true;
// Promise
const willIGetNewPhone = new Promise(
(resolve, reject) => {
if (isMomHappy) {
const phone = {
brand: 'Samsung',
color: 'black'
};
resolve(phone);
} else {
const reason = new Error('mom is not happy');
reject(reason);
}
}
);
// 2nd promise
async function showOff(phone) {
return new Promise(
(resolve, reject) => {
var message = 'Hey friend, I have a new ' +
phone.color + ' ' + phone.brand + ' phone';
resolve(message);
}
);
};
// call our promise
async function askMom() {
try {
console.log('before asking Mom');
let phone = await willIGetNewPhone;
let message = await showOff(phone);
console.log(message);
console.log('after asking mom');
}
catch (error) {
console.log(error.message);
}
}
(async () => {
await askMom();
})();
์ ํ๋ผ๋ฏธ์ค์ด๋ฉฐ ์ธ์ ์จ์ผํ ๊น?
์ ํ๋ผ๋ฏธ์ค๊ฐ ํ์ํ ๊น? ํ๋ผ๋ฏธ์ค ์ด์ ์๋ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์์ฑํ์๊น? ์ด ์ง๋ฌธ์ ๋๋ตํ๊ธฐ ์ ์ ๊ธฐ๋ณธ์ผ๋ก ๋์๊ฐ๋ณด์.
์ผ๋ฐ ํจ์ vs Async ํจ์
์ด ๋๊ฐ์ง ์๋ฅผ ์ดํด๋ณด์. ๋ ์ ๋ชจ๋ ๋๊ฐ์ ์ซ์๋ฅผ ๋ํ๋ค. ํ๋๋ ์ผ๋ฐ์ ์ธ ํจ์ ํตํด ์ถ๊ฐํ๊ณ , ๋ค๋ฅธ ํ๋๋ ์๊ฒฉ์ผ๋ก ์ถ๊ฐ ํ๋ค.
๋๊ฐ์ ์ซ์๋ฅผ ๋ํ๋ ์ผ๋ฐ ํจ์
// add two numbers normally
function add (num1, num2) {
return num1 + num2;
}
const result = add(1, 2); // you get result = 3 immediately
๋๊ฐ์ ์ซ์๋ฅผ ๋ํ๋ Async ํจ์
// add two numbers remotely
// get the result by calling an API
const result = getAddResultFromServer('http://www.example.com?num1=1&num2=2');
// you get result = "undefined"
์ผ๋ฐ ํจ์๋ฅผ ์ด์ฉํ์ฌ ์ซ์๋ฅผ ๋ํ๋ฉด ๊ฒฐ๊ณผ๊ฐ ์ฆ์ ๋ํ๋๋ค. ๊ทธ๋ฌ๋ Async ํจ์๋ฅผ ์ด์ฉํด ์๊ฒฉ ํธ์ถ์ ํ๋ฉด ๊ธฐ๋ค๋ ค์ผํ๋ฉฐ ๊ฒฐ๊ณผ๋ฅผ ์ฆ์ ์ป์ ์ ์๋ค.
์ด๋ฐ ์์ผ๋ก ์์ ํ๊ฒ ๋๋ฉด ์๋ฒ๊ฐ ๋ค์ด๋๊ฑฐ๋ ์๋ต ์๋๊ฐ ๋๋ ค์ ธ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์์ง ๋ณด์ฅํ ์ ์๋ค. ๋ํ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์ ์ฒด ํ๋ก์ธ์ค๊ฐ ์ฐจ๋จ๋๋ ๊ฒ์ ์ํ์ง ์์ ๊ฒ์ด๋ค.
API ํธ์ถ, ํ์ผ ๋ค์ด๋ก๋, ํ์ผ ์ฝ๊ธฐ๋ ์ผ๋ฐ์ ์ธ ๋น๋๊ธฐ ์์ ์ค ํ๋์ด๋ค.
ํ๋ผ๋ฏธ์ค ์ด์ ์ ์ธ๊ณ: Callback
๋น๋๊ธฐ ํธ์ถ์ ๊ผญ ํ๋ผ๋ฏธ์ค๋ฅผ ์ฌ์ฉํด์ผํ ๊น? ๊ทธ๊ฑด ์๋๋ค. ํ๋ผ๋ฏธ์ค๊ฐ ์๊ฐ๋๊ธฐ ์ด์ ์ ์ฝ๋ฐฑ์ ์ฌ์ฉํ๋ค. ์ฝ๋ฐฑ์ ๋ฐํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ๋ ํธ์ถํ๋ ํจ์์ด๋ค. ์ด์ ์์ ๋ฅผ ์ฝ๋ฐฑ์ ์ด์ฉํ๋๋ก ์์ ํด ๋ณด์.
// add two numbers remotely
// get the result by calling an API
function addAsync (num1, num2, callback) {
// use the famous jQuery getJSON callback API
return $.getJSON('http://www.example.com', {
num1: num1,
num2: num2
}, callback);
}
addAsync(1, 2, success => {
// callback
const result = success; // you get result = 3 here
});
์์ ๊ตฌ๋ฌธ์ ๊ด์ฐฎ์๋ณด์ธ๋ค. ๊ทธ๋ผ ์ ํ๋ผ๋ฏธ์ค๋ฅผ ์จ์ผํ ๊น?
๋น๋๊ธฐ ์์ ์ดํ ๋๋ค๋ฅธ ๋น๋๊ธฐ ์์ ์ ์ํํ๋ ค๋ ๊ฒฝ์ฐ์ ์ด๋กํ์ง?
์ซ์๋ฅผ ํ๋ฒ๋ง ๋ํ์ง ์๊ณ 3๋ฒ์ ๋ํด๋ณด๋ ค๊ณ ํ๋ค. ์ผ๋ฐ ํจ์์์ ๋ค์๊ณผ ๊ฐ์ดํ๋ค.
// add two numbers normally
let resultA, resultB, resultC;
function add (num1, num2) {
return num1 + num2;
}
resultA = add(1, 2); // you get resultA = 3 immediately
resultB = add(resultA, 3); // you get resultB = 6 immediately
resultC = add(resultB, 4); // you get resultC = 10 immediately
console.log('total' + resultC);
console.log(resultA, resultB, resultC);
์ฝ๋ฐฑ์ ์ฌ์ฉํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
// add two numbers remotely
// get the result by calling an API
let resultA, resultB, resultC;
function addAsync (num1, num2, callback) {
// use the famous jQuery getJSON callback API
return $.getJSON('http://www.example.com', {
num1: num1,
num2: num2
}, callback);
}
addAsync(1, 2, success => {
// callback 1
resultA = success; // you get result = 3 here
addAsync(resultA, 3, success => {
// callback 2
resultB = success; // you get result = 6 here
addAsync(resultB, 4, success => {
// callback 3
resultC = success; // you get result = 10 here
console.log('total' + resultC);
console.log(resultA, resultB, resultC);
});
});
});
์์ : https://jsbin.com/barimo/edit?html,js,console
์ด ๊ตฌ๋ฌธ์ ์น์ํ์ง ์๋ค. ํผ๋ผ๋ฏธ๋ ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ฌ๋๋ค์ ์ฃผ๋ก ์ด๊ฒ์ "์ฝ๋ฐฑ ์ง์ฅ"์ด๋ผ ๋ถ๋ฅธ๋ค. ์ฝ๋ฐฑ์ ๋๋ค๋ฅธ ์ฝ๋ฐฑ์ ์ค์ฒฉ๋์ด์๊ธฐ ๋๋ฌธ์ด๋ค. ์ฝ๋ฐฑ์ด 10๊ฐ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด, ์ฝ๋ฐฑ์ 10๋ฒ ์ค์ฒฉ๋๋ค!
์ฝ๋ฐฑ ์ง์ฅ์์ ๋ฒ์ด๋๊ธฐ
ํ๋ผ๋ฏธ์ค๋ ์ฝ๋ฐฑ ์ง์ฅ์ ๋ฒ์ด๋๊ฒํด์ค ๊ตฌ์์์ด๋ค. ๊ฐ์ ์์ ๋ฅผ ํ๋ผ๋ฏธ์ค๋ก ๊ตฌํํด ๋ณด์.
// add two numbers remotely using observable
let resultA, resultB, resultC;
function addAsync(num1, num2) {
// use ES6 fetch API, which return a promise
return fetch(`http://www.example.com?num1=${num1}&num2=${num2}`)
.then(x => x.json());
}
addAsync(1, 2)
.then(success => {
resultA = success;
return resultA;
})
.then(success => addAsync(success, 3))
.then(success => {
resultB = success;
return resultB;
})
.then(success => addAsync(success, 4))
.then(success => {
resultC = success;
return resultC;
})
.then(success => {
console.log('total: ' + success)
console.log(resultA, resultB, resultC)
});
์์ : https://jsbin.com/qafane/edit?js,console
ํ๋ผ๋ฏธ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋ฐฑ์ then
๋ก ํํํํ๋ค. ์ฝ๋ฐฑ ์ค์ฒฉ์ด ์๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๊น๋ํด ๋ณด์ธ๋ค. ๋ฌผ๋ก ES7 ๋น๋๊ธฐ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด์ด ์์ ๋ฅผ ๋์ฑ ํฅ์์ํฌ ์๋ ์์ง๋ง ๊ทธ๊ฑด ์ฌ๋ฌ๋ถ์ ๋ชซ์ผ๋ก ๋จ๊ธด๋ค :)
์๋ก์ด ๋ ์: Observables
ํ๋ผ๋ฏธ์ค๋ก ์ ์ฐฉํ๊ธฐ ์ ์, Observables
๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ํจ์ฌ ๋ ์ฝ๊ฒ ๋ค๋ฃฐ ์ ์๊ฒํ๋ ๊ฒ์ด ์๋ค.
Observables๋ 0 ๊ฐ ์ด์์ ์ด๋ฒคํธ๋ฅผ ์์ฑ ๋๋ ์๋ฃ ๋๋ ์๋ฃ๋์ง ์์ ์ ์๋ lazy ์ด๋ฒคํธ ์คํธ๋ฆผ์ด๋ค. source
ํ๋ผ๋ฏธ์ค์ Observables์ ์ฃผ์ ์ฐจ์ด์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
๋๋ ค์ ๋ง๊ณ Observables๋ก ์์ฑ๋ ๋์ผํ ์์ ๋ฅผ ๋ณด์. ์ด ์์ ์์๋ Observable๋ฅผ ์ํด RxJS๋ฅผ ์ฌ์ฉํ๋ค.
let Observable = Rx.Observable;
let resultA, resultB, resultC;
function addAsync(num1, num2) {
// use ES6 fetch API, which return a promise
const promise = fetch(`http://www.example.com?num1=${num1}&num2=${num2}`)
.then(x => x.json());
return Observable.fromPromise(promise);
}
addAsync(1,2)
.do(x => resultA = x)
.flatMap(x => addAsync(x, 3))
.do(x => resultB = x)
.flatMap(x => addAsync(x, 4))
.do(x => resultC = x)
.subscribe(x => {
console.log('total: ' + x)
console.log(resultA, resultB, resultC)
});
์์ : https://jsbin.com/dosaviwalu/edit?js,console
Observables์ ์ข ๋ ํํคํ๊ณ ์ฝ๊ฒ ์ํํ ์ ์๋ค. ์๋ฅผ ๋ค์ด ์ฝ๋ ํ ์ค ๋ง์ผ๋ก add ํจ์๋ฅผ 3์ด ์ง์ฐ
ํ๊ฑฐ๋ ํน์ ํ์์ ํธ์ถ์ ์ฌ์๋ํ ์ ์๋๋ก ์ค์ ํ ์ ์๋ค.
...
addAsync(1,2)
.delay(3000) // delay 3 seconds
.do(x => resultA = x)
...
๋ค์ ๊ธ์์ Observables์ ๋ํด ์ด์ผ๊ธฐํด ๋ณด์!
์์ฝ
์ฝ๋ฐฑ ๋ฐ ํ๋ผ๋ฏธ์ค์ ์ต์ํด ์ ธ๋ผ. ์ด๊ฒ๋ค์ ์ดํดํ๊ณ ์ฌ์ฉํด๋ผ. Observables์ ๋ํด์๋ ์์ง ๊ฑฑ์ ํ์ง ๋ง๊ณ ! ์ธ ๊ฐ์ง ๋ชจ๋ ์ํฉ์ ๋ฐ๋ผ ๊ฐ๋ฐ์ ์ํฅ์ ์ค ์ ์๋ค.
์ด ๊ธ์ด JavaScript ํ๋ผ๋ฏธ์ค๋ฅผ ๋ฐฐ์ฐ๋ ๊ฒ์ ๋์์ด ๋์ผ๋ฉด ์ข๊ฒ ๋ค. Happy coding!