본문 바로가기

Javascript

[JavaScript] Promise 값 가져오기 async await 사용

반응형

JavaScript Promise 객체의 값을 가져오는 방법 ! 

 

 

                let admin_check = areYouAdmin(userid)
                console.log(admin_check) ---> 요 부분이 안나왔다. 
          
          		async function areYouAdmin(userid){
                    let user_level = await users.findOne({where:{userid,}})
                    console.log(user_level.dataValues.admin)     -> 요기는 잘 뜨고 
                    return user_level.dataValues.admin;
                }
                

채팅 구현 중 Promise 의 값을 외부로 가져오면 계속 Pending으로만 떴다. 

areYouAdmin 이라는 함수에서 해당 userid가 관리자인지 아닌지 판별하고 싶었는데 계속 아래처럼 

Promise { <pending> }

이렇게만 뜨는 것이었다. ㅠㅠ 엄청 오래 찾다가 .then도 써보고 하다가 

                areYouAdmin(userid)
                .then(v=>{
                    console.log(v) ->값이 나옴 !  
                })

 

이렇게 then을 쓰면 안의 값을 쓸 수 있지만 꼭 then의 { } 안에서만 사용해야 한다. -> 밖에서 쓸 수 있는걸 고민하다가

찾은 방법 ! await으로 해당 값 가져오기 ! 

 

                let admin_check = await areYouAdmin(userid)

                async function areYouAdmin(userid){
                    let user_level = await users.findOne({where:{userid,}})
                    console.log(user_level.dataValues.admin)
                    return user_level.dataValues.admin;

                }

요렇게 await 를 붙이니까 값 0이 잘 나왔다. !!! 

 

 

즉, 아래 함수의 return 되는 a의 값은 promise 객체로 반환되고 이를 꺼내는 방법은 

async function A(){

    let a = await users.findOne() ~ 

    return a 

}

 

1. then  ( 하지만 then{} 안에서만 해당 값 사용 가능 

2. 또 다른 async await으로 해당 값 가져오기 !

 

 

 

 

실 예제

let id; // 전역변수 선언
let socket_array = [];
let admin_array = [];
io.sockets.on('connection', (socket) => {

    let cookies = socket.handshake.headers.cookie;
    if (cookies != undefined) {
        let cookieArr = cookies.split(';');
        cookieArr.forEach(async v => {
            let [key, value] = v.trim().split('=');
            if (key == 'AccessToken') {
                let payload = value.split('.')[1];
                let { userid, exp } = JSON.parse(Buffer.from(payload, 'base64').toString());
                id = userid
                
                // admin_check => 관리자이면 return 0 아니면 NULL 
                let admin_check = await areYouAdmin(userid)

                if (admin_check==0){
                    admin_array.push(socket.id); console.log('is admin');
                } else {
                    socket_array.push(socket.id); console.log('is user');

                    let data = {socketID:socket.id, userid,}
                    if (admin_array.length > 0){
                        admin_array.forEach(v =>{
                            socket.to(v).emit('send',data)
                        })

                    }
반응형