자바스크립트에서 비동기 함수를 처리하고 싶을 때 사용할 수 있는, ES6부터 가능한 비동기 처리 패턴이다. 비동기 처리 시점을 명확히 표현하기도 한다.
콜백 패턴의 단점
- 비동기식 처리를 위해 콜백 패턴을 사용할 시 처리 순서를 위해 여러 개의 콜백 함수가 네스팅 (중첩)되어 가독성도 나쁘게 하고 복잡도도 높아진다. 에러 처리도 힘들고...Callback Hell이 된다.
const izone = new Promise((resolve, reject) => {
//비동기 작업
if (/*비동기 작업 성공 */) {
resolve('성공');
}
else { /* 비동기 작업 수행 실패*/
reject('failure :(');
}
})
Promise 함수는 비동기 처리가 성공인지, 실패했는지에 관해 상태(state)정보를 갖는다. 하도 에러를 많이 봐서...익숙하다 특히 rejected.
pending 비동기 처리가 아직 수행되지 않은 상태: resolve 또는 reject 함수가 아직 호출되지 않은 상태
fulfilled 비동기 처리가 수행된 상태 (성공): resolve 함수가 호출된 상태
rejected 비동기 처리가 수행된 상태 (실패): reject 함수가 호출된 상태
settled 비동기 처리가 수행된 상태 (성공 또는 실패): resolve 또는 reject 함수가 호출된 상태
.then(
//성공시 호출될 함수
render,
//실패시 호출될 함수
console.error
);
.then을 적절하게 사용해 promise함수를 구현하는 것이 chaining이다.
참고 : Poiema
async function goWork(time1, timeStartWork) {
const time2 = await wakeUp(time1)
const time3 = await takeSubway(time2)
const time4 = await takeOffSubway(time3)
const arrivalTime = await arriveWork(time4)
if (arrivalTime > timeStartWork) {
fire()
}
}
//출처: https://blueshw.github.io/2018/02/27/async-await/
const request = require('request')
async function retrieveArticle(url) {
return new Promise((resolve, reject) => {
const options = {
url: url,
encoding: null
};
request(options, function (error, response, body){
if (error){
reject(error)
}
if (response){
console.log(body)
resolve(body)
}
})
});
}
// TODO: retrieve the html string from given url and return as promise
module.exports = {
retrieveArticle
};
async function writeFile(filename, body) {
return new Promise((resolve, reject) => {
fs.writeFile(filename, body, (err) => {
if (err) {
reject(err);
} else {
resolve(body);
}
});
});
// TODO: save the content with specific filename
}
async function readFile(filename) {
return new Promise((resolve, reject) => {
fs.readFile(filename, 'utf8', (err, data) => {
if (err) {
reject(err)
}
else {
resolve(data)
}
})
});
// TODO: read the content with specific filename
}
async function readLineFromSourceList(nthline) {
return new Promise((resolve, reject) => {
fs.readFile("./data/source.txt", 'utf8', (err, data) => {
if (err){
reject(err)
}
else {
resolve(data.split("\n")[nthline])
}
})
// TODO : read line via specific nthline
});
}
router.get('/', async (req, res) => {
fileHelper.readSourceListFile()
.then(data => res.status(200).send(data))
// TODO: read the content from source.txt using fileHelper
});
// POST /source
router.post('/', async (req, res) => {
fileHelper.writeSourceListFile(req.body)
.then(res.status(200).send('ok'))
// TODO: save the content to source.txt using fileHelper
});