resolve, rejectでは処理が終わらず、returnの代わりには使えないため注意が必要です。
例えば以下のコードを実行すると、どうなるでしょうか?
const flag = true;
const promise = new Promise((resolve, reject) => {
if(flag) {
console.log("成功への道");
resolve("成功!");
}
console.log("失敗への道");
reject("失敗");
});
promise
.then((value)=>console.log(`promise関数実行完了:${value}`))
.catch((value)=>console.log(`promise関数実行失敗:${value}`));
consoleには次のように表示されます。
成功への道
失敗への道
promise関数実行完了:成功!
resolveした後も処理は止まらず、reject関数も呼ばれてしまいます。
ただし、resolve,reject関数は一度呼ばれた後、状態変化しないので
catchに落ちることはありません。(参考:https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve#%E8%BF%94%E5%80%A4)
以下のようなコードを実行したとしても
const promise = new Promise((resolve, reject) => {
console.log("処理開始");
resolve("成功1");
reject("失敗1");
resolve("成功2");
reject("失敗2");
console.log("処理終了");
});
promise
.then((value)=>console.log(`promise関数実行完了:${value}`))
.catch((value)=>console.log(`promise関数実行失敗:${value}`));
consoleには次のように表示され、最初に実行したresolve関数の値(成功1)のみ返ります。
処理開始
処理終了
promise関数実行完了:成功1
resolveした後、処理を終わらせるには、明示的にreturnする
const flag = true;
const promise = new Promise((resolve, reject) => {
if(flag) {
console.log("成功への道");
resolve("成功!");
return;
}
console.log("失敗への道");
reject("失敗");
});
promise
.then((value)=>console.log(`promise関数実行完了:${value}`))
.catch((value)=>console.log(`promise関数実行失敗:${value}`));
もしくはif elseを使いresolveとrejectが排他的に行われるようにする必要があります。
const flag = true;
const promise = new Promise((resolve, reject) => {
if(flag) {
console.log("成功への道");
resolve("成功!");
}else {
console.log("失敗への道");
reject("失敗");
}
});
promise
.then((value)=>console.log(`promise関数実行完了:${value}`))
.catch((value)=>console.log(`promise関数実行失敗:${value}`));