1. async と await の基本的な動作
質問
async と await の中の処理はどのように動作しますか?
回答
-
async関数内で使用されるawaitは、非同期処理の完了を待機します。 -
awaitの中は非同期処理である必要があります。 -
async関数全体では、awaitを順番に実行してから次の処理に進みます。
例
async function example() {
console.log("Start");
const result = await new Promise((resolve) => setTimeout(() => resolve("Done"), 1000));
console.log(result); // 1秒後に "Done" が表示
console.log("End");
}
example();
// 出力順: "Start" -> 1秒待機 -> "Done" -> "End"
2. await 内の関数が Promise を返さない場合
質問
await の中のメソッドが Promise を返さない場合はどうなりますか?
回答
-
awaitに渡される値がPromiseでない場合、その値が即座に返されます。 - 非同期処理として機能しません。
例
function notAPromise() {
return "Immediate Value";
}
async function example() {
const result = await notAPromise(); // 非同期処理として扱われない
console.log(result); // "Immediate Value"
}
example();
3. 独自の関数を await で使うには
質問
独自の関数を await で使うにはどうすればいいですか?
回答
- 関数は必ず
Promiseを返す必要があります。 -
Promiseを返さない場合は、Promise.resolveでラップするか、関数をasyncにする必要があります。
例
function myAsyncFunction() {
return new Promise((resolve) => {
setTimeout(() => resolve("Done!"), 1000);
});
}
async function example() {
const result = await myAsyncFunction(); // Promise を返す関数
console.log(result); // 1秒後に "Done!" が表示
}
example();
4. Promise がエラーを返した場合のエラーハンドリング
質問
Promise がエラーを返した場合、await で catch できますか?
回答
-
awaitは、PromiseがRejected状態になった場合にエラーをスローします。 -
try-catchを使用してエラーをキャッチできます。
例
async function example() {
try {
const result = await new Promise((_, reject) => {
reject("Something went wrong!"); // エラーを発生
});
console.log(result); // 実行されない
} catch (error) {
console.error("Caught an error:", error); // "Caught an error: Something went wrong!" が表示
}
}
example();
5. Promise オブジェクトは変化しますか?
質問
Promise オブジェクトは状態が変化しますか?
回答
-
Promiseオブジェクト自体は不変です。 - 内部の状態が
Pending(保留中)からFulfilled(解決済み)またはRejected(拒否済み)に一度だけ変化します。
例
const promise = new Promise((resolve) => {
setTimeout(() => resolve("Done"), 1000);
});
console.log(promise); // 初期状態: Promise { <pending> }
setTimeout(() => {
console.log(promise); // 解決後: Promise { 'Done' }
}, 1100);
6. Promise の状態をキャッチしない場合
質問
Promise のエラーをキャッチしないとどうなりますか?
回答
-
awaitのエラーをキャッチしない場合、エラーは呼び出し元に伝播します。 - エラーを処理しないと、アプリケーションがクラッシュする可能性があります。
例
async function example() {
const result = await new Promise((_, reject) => {
reject("Something went wrong!");
});
console.log(result); // 実行されない
}
example().catch((error) => {
console.error("Caught an error in the calling code:", error);
});
まとめ
| 質問内容 | 回答 |
|---|---|
async と await の基本動作 |
await は非同期処理の完了を待機し、async 内で順序を保証します。 |
await がPromiseを返さない場合の挙動 |
即座に値が返され、非同期として機能しません。 |
独自の関数を await で使う方法 |
関数が Promise を返す必要があります。 |
Promise がエラーを返した場合の処理方法 |
try-catch を使うか、呼び出し元で .catch() を使ってエラーを処理します。 |
Promise オブジェクトは変化するか? |
オブジェクトは不変で、状態が Pending → Fulfilled/Rejected に一度だけ変化します。 |
| エラーをキャッチしないとどうなるか | エラーが呼び出し元に伝播し、処理されなければクラッシュの原因になります。 |
これにより、Promiseや非同期処理に関する重要なポイントをすべて把握できます!