개발/Javascript(Typescript)
for문을 동기적으로 처리하기
piece5
2023. 10. 10. 21:23
참고
https://donggov.tistory.com/154
문제) Comment(댓글)을 데이터베이스에서 가져와서 각 row에 새로운 key-value쌍을 추가하고 싶다.
그렇지만 for문이 다 돌기 전에 res.send({})가 실행되어 새로운 값이 추가되지 않은 data.rows를 반환한다.
export function findAll(req, res) {
const postId = req.params.id;
try {
const data = await Comment.findAndCountAll({
where: {customerBoardId:postId},
})
/** data.rows 배열을 돌면서 {editable: true(or false)}를 넣고 싶다. */
for(let i = 0; i < data.rows.length; i++) {
if(data.rows[i].userAccountUserId === req.user_id) data.rows[i].editable = true;
else data.rows[i].editable = false;
}
res.status(200).send({
"data": data.rows,
});
} catch (err) {
res.status(500).send({
message: err.message || "comment error",
});
}
}
해결) for 문이 끝난 후에 res.send()가 동기적으로 실행되기 위해서 async/await와 promise.all, map을 활용한다.
map안의 함수를 async/await를 사용해서 정의하면 결과 값이 promise로 들어온다.
이 promise 값들을 모두 처리하기 위해 Promise.all()을 사용한다.
export async function findAll(req, res) {
const postId = req.params.id;
try {
const data = await Comment.findAndCountAll({
where: {customerBoardId:postId},
});
const comments = await Promise.all(
data.rows.map((comment) =>
{ return {comment, editable : comment.userAccountUserId === req.user_id ? true : false}}
));
await res.status(200).send({
"data": comments,
});
} catch (err) {
res.status(500).send({
message: err.message || "comment error",
});
}
}