GASでゴリゴリ書いている時に気づいたのですが、new Promise で resolve しても reject しても処理は止まらない・・!
return と同じ感覚で resolve / reject を使うと痛い目みるよっていうお話です。
例えばこんなコード
let trap = false;
function step1() {
return new Promise(function(resolve, reject) {
console.log('--- step1 ---');
resolve();
});
}
function step2() {
return new Promise(function(resolve, reject) {
console.log('--- step2 ---');
if (trap) {
reject('--- error ---');
}
console.log('--- contents ---');
resolve();
});
}
function step3() {
return new Promise(function(resolve, reject) {
console.log('--- step3 ---');
resolve();
});
}
step1()
.then(() => step2())
.then(() => step3())
.catch(error => {console.log(error)});
結果
--- step1 ---
--- step2 ---
--- contents ---
--- step3 ---
trap を true にすると、— step2 — で止まると思いますよね・・?
let trap = true; にして実行した結果
--- step1 ---
--- step2 ---
--- contents ---
--- error ---
止まらずに — contents — が表示されてる・・!
止まらないのは reject だけじゃないです。resolve も止まらないので、こんな風に書き換えてみると・・
let trap = true;
function step2() {
return new Promise(function(resolve, reject) {
console.log('--- step2 ---');
if (trap) {
reject('--- error ---');
}
console.log('--- contents show ---');
resolve();
console.log('--- contents hide ---');
});
}
結果
--- step1 ---
--- step2 ---
--- contents show ---
--- contents hide ---
--- error ---
contents が全て表示されている!!
期待する動きにするには、resolve と reject の前に return が必要です(´・ω・`)
let trap = false;
function step2() {
return new Promise(function(resolve, reject) {
console.log('--- step2 ---');
if (trap) {
return reject('--- error ---');
}
console.log('--- contents show ---');
return resolve();
console.log('--- contents hide ---');
});
}
let trap = false; の結果
--- step1 ---
--- step2 ---
--- contents show ---
--- step3 ---
let trap = true; の結果
--- step1 ---
--- step2 ---
--- error ---
reject は return ではなく throw new Error(); でも止まります。
function step2() {
return new Promise(function(resolve, reject) {
console.log('--- step2 ---');
if (trap) {
throw new Error('--- error ---');
reject();
}
console.log('--- contents show ---');
return resolve();
console.log('--- contents hide ---');
});
}
結果
--- step1 ---
--- step2 ---
Error: --- error ---
at index.html:52
at new Promise (<anonymous>)
at step2 (index.html:49)
at index1.html:69
思い込みは注意ですね(´•ω• ก̀)