Promiseのrejectとthrowの違い
JavaScriptのPromiseにおけるrejectとthrowの違い
JavaScriptのPromiseは、非同期操作の結果を処理するためのオブジェクトです。Promiseは、成功した場合にresolve
メソッドを呼び出し、失敗した場合にreject
メソッドを呼び出します。
rejectメソッド
- エラーオブジェクトを渡す
通常、reject
メソッドにエラーオブジェクトを渡します。このオブジェクトは、catch
ブロックで取得され、エラー処理に使用されます。 - 直接Promiseオブジェクトを拒否する
reject
メソッドは、Promiseオブジェクト自体を拒否するために使用されます。
const promise = new Promise((resolve, reject) => {
// 非同期操作
setTimeout(() => {
if (condition) {
resolve("成功");
} else {
reject(new Error("失敗"));
}
}, 1000);
});
promise
.then(result => {
console.log("成功:", result);
})
.catch(error => {
console.error("失敗:", error.message);
});
throwキーワード
- Promiseチェーンのエラー処理
throw
キーワードを使用して関数を中断し、エラーをPromiseチェーンの次のcatch
ブロックに渡すことができます。 - 関数内部でエラーを投げる
throw
キーワードは、関数内部でエラーを投げるために使用されます。
function asyncOperation() {
return new Promise((resolve, reject) => {
// 非同期操作
setTimeout(() => {
if (condition) {
resolve("成功");
} else {
throw new Error("関数内部のエラー");
}
}, 1000);
});
}
asyncOperation()
.then(result => {
console.log("成功:", result);
})
.catch(error => {
console.error("失敗:", error.message);
});
- throwキーワード
関数内部でエラーを投げ、Promiseチェーンの次のcatch
ブロックに渡す。 - rejectメソッド
Promiseオブジェクト自体を拒否し、エラーオブジェクトを渡す。
const promise = new Promise((resolve, reject) => {
// 非同期操作
setTimeout(() => {
if (condition) {
resolve("成功");
} else {
reject(new Error("失敗"));
}
}, 1000);
});
promise
.then(result => {
console.log("成功:", result);
})
.catch(error => {
console.error("失敗:", error.message);
});
- 説明
new Promise
で新しいPromiseオブジェクトを作成します。setTimeout
で1秒後に非同期操作を実行します。condition
が真の場合、resolve
メソッドを呼び出してPromiseを成功させます。condition
が偽の場合、reject
メソッドを呼び出してPromiseを失敗させ、エラーオブジェクトを渡します。then
ブロックは成功した場合に実行され、catch
ブロックは失敗した場合に実行されます。
function asyncOperation() {
return new Promise((resolve, reject) => {
// 非同期操作
setTimeout(() => {
if (condition) {
resolve("成功");
} else {
throw new Error("関数内部のエラー");
}
}, 1000);
});
}
asyncOperation()
.then(result => {
console.log("成功:", result);
})
.catch(error => {
console.error("失敗:", error.message);
});
- 説明
asyncOperation
関数内でPromiseオブジェクトを返します。condition
が偽の場合、throw
キーワードを使用してエラーを投げます。throw
キーワードにより、関数が中断され、エラーがPromiseチェーンの次のcatch
ブロックに渡されます。
async/awaitの利用
async/await
構文は、Promiseをより同期的なコードのように扱うための方法です。async
キーワードを関数に付けることで、関数を非同期関数にします。await
キーワードを使用すると、Promiseが解決されるまでコードの実行を一時停止することができます。
async function asyncOperation() {
try {
const result = await new Promise((resolve, reject) => {
// 非同期操作
setTimeout(() => {
if (condition) {
resolve("成功");
} else {
throw new Error("関数内部のエラー");
}
}, 1000);
});
console.log("成功:", result);
} catch (error) {
console.error("失敗:", error.message);
}
}
asyncOperation();
- 説明
asyncOperation
関数を非同期関数にします。await
キーワードを使用してPromiseが解決されるまでコードの実行を一時停止します。try/catch
ブロックを使用してエラーを処理します。
Promise.allの利用
複数のPromiseを同時に処理し、すべてのPromiseが解決された後に結果を返すために、Promise.all
を使用することができます。
const promise1 = new Promise((resolve, reject) => {
// 非同期操作1
setTimeout(() => {
resolve("成功1");
}, 1000);
});
const promise2 = new Promise((resolve, reject) => {
// 非同期操作2
setTimeout(() => {
reject(new Error("失敗2"));
}, 2000);
});
Promise.all([promise1, promise2])
.then(results => {
console.log("すべてのPromiseが成功:", results);
})
.catch(error => {
console.error("いずれかのPromiseが失敗:", error.message);
});
- 説明
Promise.all
にPromiseの配列を渡します。- すべてのPromiseが解決された場合、
then
ブロックが実行され、結果の配列が渡されます。 - いずれかのPromiseが失敗した場合、
catch
ブロックが実行され、最初の失敗したPromiseのエラーが渡されます。
const promise1 = new Promise((resolve, reject) => {
// 非同期操作1
setTimeout(() => {
resolve("成功1");
}, 1000);
});
const promise2 = new Promise((resolve, reject) => {
// 非同期操作2
setTimeout(() => {
reject(new Error("失敗2"));
}, 2000);
});
Promise.race([promise1, promise2])
.then(result => {
console.log("最初に解決されたPromiseの結果:", result);
})
.catch(error => {
console.error("最初に失敗したPromiseのエラー:", error.message);
});
- 説明
- 最初に解決されたPromiseの結果が
then
ブロックに渡されます。 - 最初に失敗したPromiseのエラーが
catch
ブロックに渡されます。
- 最初に解決されたPromiseの結果が
javascript promise