whatisthis?
javaScript. ๋น๋๊ธฐ ์ฒ๋ฆฌ์ Callback ํจ์ ๋ณธ๋ฌธ
์ง๋ ํฌ์คํ ์์ Callback์ ๋ํ ์ดํด๊ฐ ์ ์๋๋ ๊ฒ ๊ฐ์
์ถ๊ฐ๋ก Callback์ ๋ํด ํฌ์คํ ํด๋ณด๊ฒ ๋ค.
์ฝ๋ฐฑ์ ๋ํด ์ค๋ช ํ๊ธฐ์ ์์,
๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ๋ฌด์์ธ์ง์ ๋ํด ๋จผ์ ์์๋ณด์.
๋น๋๊ธฐ๋ ๋๊ธฐ์์ ๋ฐ๋๋๋ ๊ฐ๋ ์ผ๋ก, ๋์ ๋น๊ตํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
Syncronous (๋๊ธฐ์) | ์์ฒญ์ ๋ณด๋ธ ํ ํด๋น ์์ฒญ์ ์๋ต์ ๋ฐ์์ผ ๋ค์ ๋์์ ์คํํ๋ ๋ฐฉ์ |
Asynchronous (๋น๋๊ธฐ) | ์์ฒญ์ ๋ณด๋ธ ํ ์๋ต๊ณผ ๊ด๊ณ์์ด ๋ค์ ๋์์ ์คํํ๋ ๋ฐฉ์ |
1 / ๋๊ธฐ์ ์ฒ๋ฆฌ
const btn = document.querySelector('button');
btn.addEventListener('click', () => {
alert('You clicked me!');
let pElem = document.createElement('p');
pElem.textContent = 'This is a newly-added paragraph.';
document.body.appendChild(pElem);
});
์ ์์ ์์ ์ฝ๋๋ ์ > ์๋ ์์ผ๋ก ์งํ๋๋ค.
1. <button> element๋ฅผ ์ฐธ์กฐํจ (DOM์ ๋ฏธ๋ฆฌ ์ ์๋์ด์์)
2. click ์ด๋ฒคํธ๋ฆฌ์ค๋๋ฅผ ๋ง๋ค์ด ๋ฒํผ ํด๋ฆญ์ ํจ์ ์คํ.
>> arrow function. ๋งค๊ฐ๋ณ์๋ ์๊ณ ,
alert๊ธฐ๋ฅ ํ์ <p>ํ๊ทธ๋ฅผ ๋ง๋ค์ด html๋ฌธ์์ ํ์ธํธํ๋ค.
ใ ก ์ฌ๊ธฐ์ alert ๊ธฐ๋ฅ์ alert์ฐฝ์ด ๋ซํ๊ธฐ ์ ๊น์ง ์น์ฌ์ดํธ๋ '์ผ์์ ์ง' ๋๋ค.
์ฆ, alert ์์ ์ดํ๋ถํฐ์ ๋ ๋๋ง์ด ์ผ์์ค์ง๋๋ ๊ฒ์ด๋ค.
(์๋ฐ์คํฌ๋ฆฝํธ๋ single thread์ด๊ธฐ ๋๋ฌธ์ ๋์์ ์งํํ์ง ๋ชปํ๊ณ , ํ๋์ ๋ฉ์ธ ์ค๋ ๋๋ก ์ฒ๋ฆฌํ๋ค.)
>> alert๋ ์ค์ ์ดํ๋ฆฌ์ผ์ด์ ์์ ๊ฑฐ์ ๊ธ๊ธฐ์๋๋ค. (์์ ๊ฐ์ ์ด์ ๋ก)
์์ ๊ฐ์ ์ด์ ๋๋ฌธ์ (๋ธ๋กํน),
๋ง์ ์น API ๊ธฐ๋ฅ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
ํนํ, ์ธ๋ถ ๋๋ฐ์ด์ค์์ ์ด๋ค ๋ฆฌ์์ค์ ์ ๊ทผํ๊ฑฐ๋ ๊ฐ์ ธ์ฌ ๋ ๋ง์ด ์ฌ์ฉํ๋ค.
2 / ๋น๋๊ธฐ์ ์ฒ๋ฆฌ
- ํฌ๊ฒ ๋๊ฐ์ง ์ ํ์ด ์๋ค.
1. j-Query์ ajax
** AJAX ๋?
Ajax(Asynchronous JavaScript and XML, ์์ด์ญ์ค)๋
๋น๋๊ธฐ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์์ ์ํด ์๋์ ๊ฐ์ ์กฐํฉ์ ์ด์ฉํ๋ ์น ๊ฐ๋ฐ ๊ธฐ๋ฒ
- ํํ ์ ๋ณด๋ฅผ ์ํ HTML (๋๋ XHTML) ๊ณผ CSS
- ๋์ ์ธ ํ๋ฉด ์ถ๋ ฅ ๋ฐ ํ์ ์ ๋ณด์์ ์ํธ์์ฉ์ ์ํ DOM, ์๋ฐ์คํฌ๋ฆฝํธ
- ์น ์๋ฒ์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๊ณ ์กฐ์ํ๊ธฐ ์ํ XML, XSLT, XMLHttpRequest
+) Ajax ์ ํ๋ฆฌ์ผ์ด์ ์ XML/XSLT ๋์ ๋ฏธ๋ฆฌ ์ ์๋ HTML์ด๋ ์ผ๋ฐ ํ ์คํธ, JSON, JSON-RPC๋ฅผ ์ด์ฉํ ์ ์์.
function getData() {
var tableData;
$.get('https://domain.com/products/1', function(response) {
tableData = response;
});
return tableData;
}
console.log(getData()); // undefined
์ฌ๊ธฐ์ $.get()์ด ajax ํต์ ์ ํ๋ ๋ถ๋ถ์ด๋ค.
https://domain.com์
HTTP GET ์์ฒญ์ ๋ ๋ ค 1๋ฒ product์ ์ ๋ณด๋ฅผ ์์ฒญํ๋ ์ฝ๋. (get ์์ฒญ์ ๋ค์ ์ ๋ ๊ฒ /1๊ณผ ๊ฐ์ด ๋ถ์)
๊ทธ๋ฆฌ๊ณ , ์๋ฒ์์ ๋ฐ์์จ ๋ฐ์ดํฐ๋ response์ธ์์ ๋ด๊ธด๋ค.
tableData๋ผ๋ ๋ณ์์ ๊ทธ ๊ฐ์ ์ ์ฅํ๋ค.
>> ๊ทธ๋ผ ์ด์ ์ด getData()๋ฅผ ํธ์ถํ๋ฉด ?? ใ ก undefined๊ฐ ๋์ด.
์?
$.get() ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ ๊ธฐ๋ค์ง ์๊ณ ๋ฐ๋ก return tableDate๋ฅผ ํ๊ธฐ ๋๋ฌธ.
(์ฆ, ๋น๋๊ธฐ์ ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ๋๋ฌธ)
์์ ๊ฐ์ด ํน์ ๋ก์ง์ด ์คํ์ด ๋๋ ๋ ๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ
์ดํ์ ์ฝ๋๋ฅผ ๋จผ์ ์คํํ๋ ๊ฒ์ด ๋ฐ๋ก ๋น๋๊ธฐ ์ฒ๋ฆฌ์ด๋ค.
2. setTimeout()
- WEB API์ ํ ์ข ๋ฅ์ด๋ค.
๐ก API(Application Programming Interface)
- ์๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ถ์ ๊ตฌ ์ญํ .
- ์ดํ๋ฆฌ์ผ์ด์ ๊ณผ ๊ธฐ๊ธฐ๊ฐ ์ํํ๊ฒ ํต์ ํ ์ ์๋๋ก ํด์ค.
- ๋ชจ๋ ์ ์์ ํ์คํ (๊ธฐ๊ณ๋ OS์ ๋ฌด๊ด)
>> private / public / partner API๊ฐ ์กด์ฌํจ.
private API๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ, ์ฝ๋์ ์์ฑ๋ฐฉ๋ฒ์ ํ์คํํด์ ๋น ๋ฅธ ํ๋ก์ธ์ค ์ฒ๋ฆฌ ๊ฐ๋ฅ. + S/W ํตํฉ, ํ์ ์ฉ์ด
- ์ฝ๋๋ฅผ ๋ฐ๋ก ์คํํ์ง ์๊ณ ์ง์ ํ ์๊ฐ๋งํผ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ก์ง์ ์คํํจ.
console.log('Hello');
setTimeout(function() {
console.log('Bye');
}, 3000);
console.log('Hello Again');
// result : 'Hello' > 'Hello Again' >(3์ดํ) 'Bye' ์์ผ๋ก
- setTimeout()์ ๋จผ์ ์คํํ๊ณ ๋์ 'Hello Again'์ด ์คํ๋ ๊ฒ์.
๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๋ฌธ์ ์ ํด๊ฒฐ
- ์ฝ๋ฐฑ(callback)์ ์ด์ฉํด์ ํด๊ฒฐํ ์ ์์.
๊ธฐ์กด ์ฝ๋ > [๋๋ณด๊ธฐ]ํด๋ฆญ
function getData() {
var tableData;
$.get('https://domain.com/products/1', function(response) {
tableData = response;
});
return tableData;
}
console.log(getData()); // undefined
function getData(callbackFunc) {
$.get('https://domain.com/products/1', function(response) {
callbackFunc(response); // ์๋ฒ์์ ๋ฐ์ ๋ฐ์ดํฐ response๋ฅผ callbackFunc() ํจ์์ ๋๊ฒจ์ค
});
}
getData(function(tableData) {
console.log(tableData); // $.get()์ response ๊ฐ์ด tableData์ ์ ๋ฌ๋จ
});
- ์์ ๊ฐ์ด ์ฝ๋ฐฑํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ํน์ ๋ก์ง์ด ๋๋ฌ์ ๋ ์ํ๋ ๋์ ์คํ ๊ฐ๋ฅ.
- callbackFunc(response)๋ฅผ ํด์, ์๋ฒ์์ ๋ฐ์ ๋ฐ์ดํฐ์ธ response๋ฅผ ์ฝ๋ฐฑํจ์์ ๋๊ฒจ์ค๋ค.
>> ์ฌ๊ธฐ์, callbackFunc๋ getData ํจ์์ ์ธ์๋ก ๋ฐ๋ ํจ์์.
์ฆ, ์๋ ์คํ๋ถ์์๋ function(tableData) { console.log(tableData) } ์ ํด๋นํ๋ ๊ฒ์ด
์ฝ๋ฐฑํจ์, ์ฆ ํจ์์ ์ธ์๋ก ๋ค์ด๊ฐ๋ ํจ์์.
- ์ฐ์ ๋๊ธฐ๋ช ๋จ ์์ฑํ๊ณ ๋๊ธฐํจ ใ ก ๋ค์ ์ ํ๋ฐ๋ ์๊ฐ = ์ฝ๋ฐฑ์ด ํธ์ถ๋๋ ์๊ฐ์.
์ ๋ฆฌ
- ์ฝ๋ฐฑํจ์๋ ๋งค๊ฐ๋ณ์(parameter)๋ก ํจ์๋ฅผ ์ ๋ฌ๋ฐ์, ํจ์ ๋ด๋ถ์์ ์คํํ๋ ํจ์์ด๋ค.
- ์> forEach์ ๊ฒฝ์ฐ์ ํจ์์์ ์ต๋ช ์ ํจ์๋ฅผ ๋ฃ์ด ๋์์ํจ๋ค.
let number = [1, 2, 3, 4];
number.forEach(x => { // forEach ํจ์(๋ฉ์๋)์์
console.log(x * 2); // ์ต๋ช
ํจ์๊ฐ ์กด์ฌ ใ
ก forEach ์์์ ์คํ
});
- ์ฝ๋ฐฑํจ์๋ ์ด๋ฆ์ด ์๋ ์ต๋ช ํจ์๋ฅผ ์ฌ์ฉ. (ํจ์ ๋ด๋ถ์์ ์คํ๋๋ฏ๋ก ์ด๋ฆ ํ์ X)
- ํ์ดํํจ์ (=>)๋ฅผ ์ฐ๊ฑฐ๋, function() { ๋ด์ฉ } ๊ณผ๊ฐ์ด ์ฌ์ฉ
- ํจ์๋ฅผ ์ฝ๋ฐฑํจ์๋ก ์ฌ์ฉ์, ํจ์์ ์ด๋ฆ์ ๋๊ฒจ์ค(reference)
- ํจ์์ ์ด๋ฆ์ ๋๊ฒจ์ค์ ๊ทธ ์ด๋ฆ์ ๊ฐ์ง ํจ์๊ฐ ์คํ๋๋๋ก ํ๋ ์์ . ์ฆ, callback์ด๋ผ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ()๋ก ํธ์ถ์ ํ๋๋ฐ, ๊ทธ callback์ ๋ณ์์ฒ๋ผ goodBye ํจ์๋ฅผ ์ธ์๋ก ๋ฃ์ ๊ฒ์.function whatYourName(name, callback) { // callback(ํจ์)๋ฅผ ์ธ์๋ก ๋ฐ์ console.log(name); callback(); // ์ฝ๋ฐฑ ์คํ } function goodBye() { console.log('goodbye!'); } WhatYourName('yjin', goodBye); // name์ 'yjin'์ ๋ฌ, callback์ goodByeํจ์ ์ ๋ฌ ๊ฒฐ๊ณผ : yjin goodbye!โ
this์ ๊ฒฝ์ฐ์๋ ์ฝ๋ฐฑ์์ ์ฌ๋ผ์ง๋ค.
๋ฐ๋ผ์, call()๊ณผ apply()๋ก this๋ฅผ ๋ณดํธํ๋ ์ฝ๋ฐฑ์ ๋ง๋ค์ด์ผํ๋ค.
REFERENCE
'WEB STUDY > JAVASCRIPT' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
javaScript. (22) ๊ฐ์ฒด์ ๋ณต์ฌ (0) | 2022.01.30 |
---|---|
javaScript. (21) ํจ์์ ๋ฉ์๋์ argument (0) | 2022.01.30 |
javaScript. (20) Event Listener / Callback (0) | 2022.01.29 |
javaScript. ์ด๋ฒคํธ(on__)์ ์ข ๋ฅ (0) | 2022.01.28 |
javaScript. (19) JSON (stringify / parse) (0) | 2022.01.28 |