눈에 띄는 차이점 : 약속 거부는 다른 장소에서 처리됩니다.
return somePromise
somePromise 는 콜 사이트에 전달 하고 await
somePromise 는 콜 사이트 (있는 경우)에 정산합니다. 따라서 somePromise가 거부되면 로컬 catch 블록이 처리하지 않고 호출 사이트의 catch 블록이 처리합니다.
async function foo () {
try {
return Promise.reject();
} catch (e) {
console.log('IN');
}
}
(async function main () {
try {
let a = await foo();
} catch (e) {
console.log('OUT');
}
})();
// 'OUT'
return await somePromise
지역에 정착 하겠다는 약속 을 먼저 기다릴 것입니다 . 따라서 값 또는 예외가 먼저 로컬에서 처리됩니다. => somePromise
거부 되면 로컬 catch 블록이 실행됩니다 .
async function foo () {
try {
return await Promise.reject();
} catch (e) {
console.log('IN');
}
}
(async function main () {
try {
let a = await foo();
} catch (e) {
console.log('OUT');
}
})();
// 'IN'
이유 : return await Promise
로컬 및 외부 모두를 return Promise
기다립니다.
세부 단계 :
약속 반환
async function delay1Second() {
return delay(1000);
}
- 전화
delay1Second()
;
const result = await delay1Second();
- 내부
delay1Second()
에서 함수 delay(1000)
는 [[PromiseStatus]]: 'pending
. 그것을라고 부르 자 delayPromise
.
async function delay1Second() {
return delayPromise;
// delayPromise.[[PromiseStatus]]: 'pending'
// delayPromise.[[PromiseValue]]: undefined
}
- 비동기 함수는 반환 값을
Promise.resolve()
( Source ) 안에 래핑합니다 . delay1Second
비동기 함수 이기 때문에 다음 이 있습니다.
const result = await Promise.resolve(delayPromise);
// delayPromise.[[PromiseStatus]]: 'pending'
// delayPromise.[[PromiseValue]]: undefined
Promise.resolve(delayPromise)
delayPromise
입력이 이미 약속이기 때문에 아무것도하지 않고 반환합니다 ( MDN Promise.resolve 참조 ).
const result = await delayPromise;
// delayPromise.[[PromiseStatus]]: 'pending'
// delayPromise.[[PromiseValue]]: undefined
await
delayPromise
가 정착 될 때까지 기다립니다 .
delayPromise
PromiseValue = 1로 충족되는 IF :
const result = 1;
// jump to catch block if there is any
반환 대기 약속
async function delay1Second() {
return await delay(1000);
}
- 전화
delay1Second()
;
const result = await delay1Second();
- 내부
delay1Second()
에서 함수 delay(1000)
는 [[PromiseStatus]]: 'pending
. 그것을라고 부르 자 delayPromise
.
async function delay1Second() {
return await delayPromise;
// delayPromise.[[PromiseStatus]]: 'pending'
// delayPromise.[[PromiseValue]]: undefined
}
- 현지 대기는
delayPromise
정착 될 때까지 기다립니다 .
- 사례 1 :
delayPromise
PromiseValue = 1로 충족됩니다.
async function delay1Second() {
return 1;
}
const result = await Promise.resolve(1); // let's call it "newPromise"
const result = await newPromise;
// newPromise.[[PromiseStatus]]: 'resolved'
// newPromise.[[PromiseValue]]: 1
const result = 1;
- 사례 2 :
delayPromise
거부 됨 :
// jump to catch block inside `delay1Second` if there is any
// let's say a value -1 is returned in the end
const result = await Promise.resolve(-1); // call it newPromise
const result = await newPromise;
// newPromise.[[PromiseStatus]]: 'resolved'
// newPromise.[[PromiseValue]]: -1
const result = -1;
용어 사전:
- 정착 :
Promise.[[PromiseStatus]]
변경 사항 pending
에 resolved
나rejected