【JavaScript】new Promiseでresolveしてもrejectしても処理は止まらない

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

思い込みは注意ですね(´•ω• ก̀)