개발/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",
        });
    }

}