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 <----