์๋ฐ์คํฌ๋ฆฝํธ๋ ๋น๋๊ธฐIO(์
์ถ๋ ฅ) ๋ชจ๋ธ์ ์ด์ฉํด์ ์ฌ๋ฌ๊ฐ์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๋น๋๊ธฐIO ๋ชจ๋ธ์ ์ฌ์ฉ์๊ฐ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์๋ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ์ง ์๊ณ ์ด๋ฒคํธ๊ฐ ๋๋ฌ์ ๋ ์๋ ค์ค ์ ์๋ ๊ฒฝ๋ก๋ง ์ ๊ณตํด์ฃผ๋ ๊ฒ์
๋๋ค. ๊ทธ๋์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ ํ ๋ค๋ฅธ ์ด๋ฒคํธ๋ฅผ ๋ ๋ฐ์์ํฌ ์ ์์ต๋๋ค.
๋ด๋ถ์์๋ ์ฌ๋ฌ๊ฐ์ ์ฐ๋ ๋์ ํ๋ก์ธ์ค๊ฐ ๋ณ๋ ฌ์ ์ผ๋ก ์ผ์ ์ฒ๋ฆฌํ๋ฉฐ, ๋ด๋ถ์ ์๋ ํ๋ก์ธ์ค๋ค์ด ์ผ์ด ๋๋๋ฉด ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์๋ ์๋ ค์ค ๊ฒฝ๋ก๋ฅผ ํตํด ์ ์ถ๋ ฅ์ด ๋๋ฌ์์ ์๋ ค์ค๋๋ค.
๊ธฐ์กด์๋ ๋น๋๊ธฐ ์ด๋ฒคํธ๊ฐ ๋ง์ง ์์๊ธฐ ๋๋ฌธ์ ์ฝ๋ฐฑ์ด๋ผ๋ ํจ์๋ฅผ ์ด์ฉํด์ ์ด๋ฒคํธ๊ฐ ๋๋๊ฒ์ ๋ํด ์๋ฆผ์ ๋ฐ์ ์ ์์๋๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ฐ์ ํ๋ฉด์ ๋น๋๊ธฐ ์ด๋ฒคํธ๊ฐ ๋ง์์ง๋ค ๋ณด๋๊น ์ฝ๋ฐฑ์ผ๋ก ์ธํด ์์ค์ฝ๋๊ฐ ๋ณด๊ธฐ๊ฐ ๋ถํธํด์ง๋ ์ํฉ์ด ์๊ฒจ์ Promise๋ผ๋ ๊ฐ๋ ์ด ๋์ค๊ฒ ๋ฌ์ต๋๋ค.
//1๋ฒ ํจ์๊ฐ ๋๋๋ฉด 2๋ฒํจ์๊ฐ ์์๋๊ณ 2๋ฒํจ์๊ฐ ๋๋๋ฉด 3๋ฒํจ์๊ฐ ์์๋๋ ๊ฒฝ์ฐ ์ด๋ฐ๋ชจ์ต์ ์ฝ๋ฐฑํฌ์ด๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
func1(function(){
func2(function(){
func3(function(){
});
})
});
๋น๋๊ธฐ ํจ์๊ฐ n๊ฐ์ธ ๊ฒฝ์ฐ ์์ชฝ์ผ๋ก n๋งํผ ๋ค์ด๊ฐ๊ฒ ๋์ง๋ง, Promise๋ฅผ ์ฌ์ฉํ๊ฒ๋๋ฉด ์ฝ๋ฐฑํฌ์ ํด๊ฒฐํ ์ ์์ต๋๋ค.
func1()
.then(func2)
.then(func3)
.then(function(){
})
๋ง์ฝ func1 func2 func3์ด ๊ฐ๊ฐ 3์ด๊ฐ์ ์คํ ์๊ฐ์ ๊ฐ์ง๋ค๊ณ ํ๋ฉด ์์ ์คํ๊ฒฐ๊ณผ๋ ์ด 9์ด๊ฐ ๋ฉ๋๋ค.
ํญ์ ๋น๋๊ธฐ ์ด๋ฒคํธ๊ฐ ์ฐ๊ด๊ด๊ณ๊ฐ ์กด์ฌํ๋ ๊ฒ๋ง์ ์๋๋๋ค. ์ฌ๋ฌ๊ฐ์ ๋๋ ํ ๋ฆฌ์์ ํ์ผ์ ๋์์ ์ญ์ ์์ผ์ผ๋๋ ๊ฒฝ์ฐ 1๋ฒ์ด ๋จผ์ ์ญ์ ๊ฐ ๋๋ 2๋ฒ์ด ๋จผ์ ์ญ์ ๊ฐ ๋๋ ์๊ด์ด ์์ต๋๋ค.
//์๋ชป๋ ๋น๋๊ธฐ ์ฌ์ฉ
const fs = require('fs');
async function deleteDir(dir){
var files = fs.readDirSync(dir);
for(var i = 0; i< files.length;i++){
await deleteFile(files[i]); // ํด๋์ ์๋ ํ์ผ์ ํ๋์ฉ ์ง์ด๋ค.
}
}
deleteDir('test').then(_=>{ //asyncํจ์์ ๋ฐํ ๊ฒฐ๊ณผ๊ฐ์ Promise๊ฐ์ฒด then์ผ๋ก ์ด๋ฒคํธ๊ฐ ์ข
๋ฃ ๋์์์ ์ ์ ์๋ค.
console.log('์ญ์ ์๋ฃ');
});
async์ await๋ Promise๋ฅผ ์ข ๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ๋์จ ๋ฌธ๋ฒ์
๋๋ค.
asyncํจ์๋ Promise๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ณ ์์์ ์คํ๋๋ ๋ ๋ค๋ฅธ Promise๋ฅผ then์ ์ฐ์ง ์๊ณ await๋ก ๊ธฐ๋ค๋ ค ๋น๋๊ธฐํจ์๋ฅผ ๋๊ธฐ ํจ์ ์ฒ๋ผ ๋ณด์ด๊ฒ ๋์์ค๋๋ค.
ํ์ง๋ง ์์์ ํ์ผ์ ์ง์ฐ๋ ๋น๋๊ธฐ ํจ์์ธ deleteFile๊ฐ ์คํ๋๋๋ฐ 5์ด๊ฐ ๊ฑธ๋ฆฐ๋ค๋ฉด ํ์ผ์ ๊ฐ์ * 5์ด๊ฐ ๊ฑธ๋ฆฌ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋์ ์ ๋ฐ ๋ฐ๋ณต์ ์ธ ๋น๋๊ธฐ ์ํฉ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด Promise.all์ ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค.
//์๋ชป๋ ๋น๋๊ธฐ ์ฌ์ฉ
const fs = require('fs');
async function deleteDir(dir){
var files = fs.readDirSync(dir);
return Promise.all(files.map(deleteFile));
}
deleteDir('test').then(_=>{ //asyncํจ์์ ๋ฐํ ๊ฒฐ๊ณผ๊ฐ์ Promise๊ฐ์ฒด then์ผ๋ก ์ด๋ฒคํธ๊ฐ ์ข
๋ฃ ๋์์์ ์ ์ ์๋ค.
console.log('์ญ์ ์๋ฃ');
});
์์ค์ฝ๋๋ ์งง์์ก๊ณ ์ด์ ๋ ์คํ์๋๊ฐ ํ์ผ์ 1๊ฐ ์ง์ฐ๋ ์๋์ 100๊ฐ๋ฅผ ์ง์ฐ๋ ์๋์ ๋ช์ด๋ ์ฐจ์ด๊ฐ ๋์ง ์์ต๋๋ค.
deleteFileํจ์๊ฐ Promise๊ฐ์ฒด๋ฅผ ๋ฐํํด์ค๋ค๊ณ ๊ฐ์ ํ๋ฉด files.map(deleteFile)์ Promise array๋ฅผ ๋ฐํํด์ค๋๋ค.
Promise array๋ Promise.all๋ก ์คํ์ ์ํฌ ์ ์๊ณ Promise.all์ Promise array๋ฅผ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌ๋ฅผ ํ๋ค์์ ๋ชจ๋
Promise๊ฐ์ฒด๋ค์ด ์ข
๋ฃ๊ฐ ๋๋ฉด Promise๊ฐ์ฒด๋ฅผ ๋ฐํํด์ฃผ๋๋ฐ ํด๋น ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๊ธฐ ๋๋ฌธ์ deleteDir('test').then๊ฐ์ ๋ฌธ๋ฒ์ผ๋ก ๋ชจ๋ ํ์ผ์ ์ง์ฐ๊ณ ๋์ ์๋ฆผ์ ๋ฐ์ ์ ์์ต๋๋ค.
์ฐ๊ด๊ด๊ณ๊ฐ ์๋ ๋น๋๊ธฐ ์ํฉ๊ณผ ์ฐ๊ด๊ด๊ณ๊ฐ ์๋ ๋น๋๊ธฐ ์ํฉ์ ๊ณ ๋ คํ๋ค๋ฉด ํ๋ก๊ทธ๋จ์ ์คํ์๋๋ฅผ ๋ ๋น ๋ฅด๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.