JS에서 프로미스(promise) 사용시 최종적으로는 동기적으로 리턴 받을 수 없다. async await 도 마찬가지.

JS의 프로미스는 비동기로만 동작하며, 
async await 를 사용한다고 해도, 만들어지는 건 프로미스다.
문법적으로 보이기에 동기적으로 보이겠지만, 
async 로 만들어진 함수를 실행하면 프로미스가 리턴된다.
즉, async 로 만들어진 함수를 실행하여 프로미스를 가져와서 처리해야하므로 비동기로 동작하므로 처리된 값을 리턴 받을 수 없다.

---------=-----------
await 는 async 속에서만 동기적으로 보이게 동작한다.
그래서 await 를 사용하면 return 을 받을 수 있지만, 최종적으로 async 로 불려야하기에 최종에 가서는 값을 리턴을 받을 수 없다.
----------=---------
function pro(){ return new Promise((resolve,reject)=>{ 
        console.log('start pro'); 
        resolve('resolve pro');
        console.log('end pro');
        return 'return pro' 
    });
}
async function aaa(){ 
    console.log('start aaa');
    let rp = await pro(); 
    console.log('log from return from pro: ',rp);
    console.log('end aaa');
    return 'return aaa';
}
r = aaa()
console.log('return value aaa(): ',r.toString())
r2 = r.then((v)=>{console.log('log from return from aaa: ',v)})
console.log('return value aaa().then(): ',r2.toString())
=>
start aaa
start pro
end pro
return value aaa():  [object Promise]    <---
return value aaa().then():  [object Promise]   <---
log from return from pro:  resolve pro
end aaa
log from return from aaa:  return aaa

---------=---------
'return aaa', 'return pro' 를 받을 방법이 없다.
aaa() 든 aaa().then() 이든 리턴 값을 프로미스다.






-------=----------
예외적으로 소스에서 바로 호출(함수 등에서 부르지 않을 경우)
await 사용이 가능하며, return 받을 수 있다.

----=---------
r = await aaa()
console.log('return value aaa(): ',r.toString())
=>
start aaa
start pro
end pro
log from return from pro:  resolve pro
end aaa
return value aaa():  return aaa  <-----

------=-------
let r = await pro();
console.log('return from pro:'+r);
=>
start pro
end pro
return from pro:resolve pro  <----


댓글
  • No Nickname
    No Comment
  • 권한이 없습니다.
    {{m_row.m_nick}}
    -
제목 작성자 날짜
공대여자
공대여자
mins01
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자
공대여자