๐ช JavaScript. Synchronous, asynchronous w/ ์ํ์ฝ๋ฉ
Preface
๐ ๊ฐ๋ฐ ๊ณต๋ถ 6๊ฐ์ ์ฐจ์ธ to-be ๊ฐ๋ฐ์์ ์์ต blog๐๏พ Feb 13 ~ 19, 2021
ํ์ฌ ์ํ
๋ณต์ตํ๋ผ๋ ๋ง ๋ง์ด ๋ค์๋ ๋๊ธฐ, ๋น๋๊ธฐ ๊ฐ์ ํ์ต
(+) ๋ง์นจ ๊ด๋ จ ๊ฐ์๋ฅผ ์ฌ๋ ค์ฃผ์ ์ด๊ณ ์๋!
1. callback function
callback ํจ์๋ ๋ค๋ฅธ ํจ์์ ์ ๋ ฅ ๊ฐ์ผ๋ก ์ ๋ฌ๋์ด์ ๋์ค์ ํธ์ถ๋๋ ํจ์
// ๐ต 6๊ธ์๋ณด๋ค ๋ง์ ๋จ์ด ์ถ์ถํ๊ธฐ
words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
// (1)
newWords = words.filter(element => element.length > 6); // ์ต๋ช
ํจ์
console.log(newWords);
// โฌ๏ธ Output
// ['exuberant', 'destruction', 'present']
// (2)
function newfilter(origin, callback) {
var result = [];
for (var i = 0 ; i < origin.length ; i++) {
var current = origin[i];
if (callback(current)) {
result.push(current);
}
}
return result;
}
newWords = newfilter(words, element => element.length > 6);
console.log(newWords);
// โฌ๏ธ Output
// ['exuberant', 'destruction', 'present']
โ๏ธ first class citizen (1๊ธ ์๋ฏผ / ๊ฐ์ฒด)
๋ณ์๊ฐ ๋ ์ ์์ผ๋ฉด, ๋ณ์๊ฐ ๋ค๋ฅธ ํจ์์ return ๊ฐ์ด ๋ ์ ์์ผ๋ฉด, ๋ณ์๊ฐ ๋ค๋ฅธ ํจ์์ ์
๋ ฅ ๊ฐ์ด ๋ ์ ์์ผ๋ฉด 1๊ธ ์๋ฏผ
์๋๋ฉด, ์์ผ๋ฉด 2๊ธ ์๋ฏผ
2. Promise
- "๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ค."
- ์์ฐจ์ ์ผ๋ก ์คํ๋๋ฏ๋ก ์ด์ code์ ์คํ์ด ์๋ฃ๋๊ธฐ ์ ๊น์ง ๋ค์ code๊ฐ ์คํ๋์ง ์์
- ์คํ ์์๋ฅผ ํ์ ํ๊ธฐ ์ฌ์ฐ๋ ์๋๊ฐ ๋๋ฆด ์ ์์
- "๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ค."
- ๋ ๋ฆฝ์ ์ผ๋ก, ์์ ์ ์๊ฐํ์ ๋ง๊ฒ, ๋ณ๋ ฌ์ ์ผ๋ก ์คํ๋จ (์ด์ code์ ์คํ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์)
- ์์๋ ํผ๋์ค๋ฌ์ธ ์ ์์ผ๋ ์๋๊ฐ ๋น ๋ฆ
- ์๋ฅผ ๋ค์ด, server์ web browser๊ฐ ํต์ ํ๋ ์ํฉ์์ ์ธ์ ๋๋ ์ง ๋ชจ๋ฅด๋ ํต์ ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ ์๋๋ผ ํต์ ํ๋ ๋์ ๋ค๋ฅธ ์ผ์ ํ๊ณ ์๋ค๊ฐ ํต์ ์ด ๋๋๋ฉด callback ํจ์๊ฐ ํธ์ถ๋๋ฉด์ ํ์ํ ์์ ์ ๊ทธ๋ (ํ๊ณ ์ถ์ ๋) ์ฌ์ฉ
โ๏ธ ajax
browser์ web server๊ฐ page๋ฅผ reloadํ์ง ์๊ณ JavaScript๋ฅผ ํตํด ์ํตํ๋ ๊ฒ
e.g. ๊ฒ์์ฐฝ์ ๊ฒ์์ด๋ก ์ด์ฑ, ์ค์ฑ, ์ข
์ฑ์ ํ๋ํ๋ ๋๋ฅผ ๋๋ง๋ค ํต์ ํจ
promise
- ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ ๋ ๊ทธ ์์ ์ ์ฑ๊ณต ์ฌ๋ถ์ ๋ฐ๋ผ ํ์คํ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ
.then()
,.catch()
๋ ๊ฐ์ง method๋ฅผ ์ฌ์ฉํ ์ ์์ (๋ ๋ค callback ํจ์๋ฅผ ๋ฐ์)- promise ํจ์๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์คํ๋๋ฉด
.then()
method๊ฐ response ๊ฐ์ฒด๋ฅผ ์ ๋ฌํจ - promise ํจ์๊ฐ ์คํจํ๋ฉด
.catch()
method๊ฐ reason ๊ฐ์ฒด๋ก ์คํจ ์ฌ์ ๋ฅผ ์ ๋ฌํจ
- promise ํจ์๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์คํ๋๋ฉด
- web browser์ web server๊ฐ ํต์ ํ ๋ ์ฌ์ฉํ๋ patch API๊ฐ promise๋ผ๋ data type์ ์ฌ์ฉํจ (returnํจ)
- ๋น๋๊ธฐ ์คํ์ผ ํ๋ฅ ์ด ๋์
nested promise
.then()
์์ ๋.then()
...
promise chaining
- promise๋ฅผ ํตํด
.then()
์ ๋ฐ๊นฅ์ผ๋ก ์ฐ๊ฒฐํ ๊ฒ
fetch('https://jsonplaceholder.typicode.com/posts')
.then(function(response) {
return response.json();
})
.catch(function(reason) {
console.log('reason', reason);
})
.then(function(data) {
console.log('data', data);
});
3. Async, Await
timer(1000, function() {
console.log('์์
');
timer(1000, function() {
console.log('์์
');
timer(1000, function() {
console.log('์์
');
});
});
});
// โ
timer(1000)
.then(function() {
console.log('์์
')
return timer(1000);
})
.then(function() {
console.log('์์
')
return timer(1000);
})
.then(function() {
console.log('์์
')
})
// โ
async function run() {
await timer(1000)
console.log('์์
')
await timer(1000)
console.log('์์
')
await timer(1000)
console.log('์์
')
}
run();
async
๋ ํจ์๋ฅผ promise๋ก returnํด ๋น๋๊ธฐ์ ์ผ๋ก ์คํํ๋ค.
new Promise
๋ด๊ฐ promise ๋ง๋ค๊ธฐ (์ด์ ๊น์ง๋ ๋ค๋ฅธ ์ฌ๋์ด ๋ง๋ promise ์ฐ๊ธฐ)
function job1() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
reject("job1 fail!");
}, 2000);
});
}
function job2() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve("job2 ok!");
}, 2000);
});
}
job1()
.then(function(data) {
console.log("data1", data);
return job2();
})
.catch(function(reason) {
console.log("reason", reason);
// return Promise.reject(reason); ๋ค์์ ์ค๋ then (job2) ์ ์คํ์ํค๊ณ ์ถ์ง ์์ ๋
})
.then(function(data) {
console.log("data2", data);
})
all, race
Promise.all([])
- ๊ฐ์ฅ ๋์ค์ ๋๋๋ code ๋ค์์ callback ํจ์๊ฐ ์คํ๋๊ฒ ํจ
function timer(time) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(time);
}, time);
});
}
console.time("Promise.all");
Promise.all([timer(1000), timer(2000), timer(3000)]).then(function(result) {
console.log("result", result); // result (3) [1000, 2000, 3000]
console.timeEnd("Promise.all"); // Promise.all: 3001.748046875 ms
});
Promise.race([])
- ๊ฐ์ฅ ๋จผ์ ๋๋๋ code ๋ค์์ callback ํจ์๊ฐ ์คํ๋๊ฒ ํจ
function timer(time) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(time);
}, time);
});
}
console.time("Promise.race");
Promise.race([timer(1000), timer(2000),timer(3000)]).then(function(result) {
console.log("result", result); // result 1000
console.timeEnd("Promise.race"); // Promise.race: 1002.871826171875 ms
});
Endnote
๐ related documents
MDN - Callback Function
{json} placeholder
๐ the source of this content
์ํ์ฝ๋ฉ
์ง์์ง๋ ์๋ง
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ช JavaScript. Synchronous, asynchronous w/ ์ํ์ฝ๋ฉ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@maimade/javascript000์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค