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}}
    -
목록형 📷 갤러리형
제목
[기본형] HTML (with 부트스트랩5.3 , jquery 3.7, vue.js)
유용한 리눅스(LINUX) 명령어
[공지] 기술 게시판
12.29
12.30
1.1
1.2
1.4
1.5
1.6
1.7
1.8
1.9
1.10
1.11
1.12
1.13
1.14
1.15
1.16
1.17
1.18
1.19
1.20
1.21
1.22
1.23
1.24
1.25
1.26
1.27
1.28
1.29
1.30
1.31
2.1