顕著な違い:約束の拒否は別の場所で処理されます
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がローカルで決済されるのを待ちます。したがって、値または例外は最初にローカルで処理されます。=> somePromise
拒否された場合、ローカルキャッチブロックが実行されます。
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)
はすぐにpromiseを返します[[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
入力はすでにpromiseであるため、何もせずに戻ります(MDN Promise.resolveを参照)。
const result = await delayPromise;
// delayPromise.[[PromiseStatus]]: 'pending'
// delayPromise.[[PromiseValue]]: undefined
await
delayPromise
が解決するまで待機します。
- IF
delayPromise
がPromiseValue = 1で満たされている場合:
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)
はすぐにpromiseを返します[[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