◆ Promise 拡張はあんまり
◆ then に渡す関数をラップするのは見た目的にはきれい
  ◆ then のチェーンで処理は行われてるので毎回スキップ判断と関数実行はあり
◆ 普通に分岐点で一旦チェーン切るのが一番いいのかも

こういう then のチェーンを使った関数があります

function f(){
return something()
.then(fn1)
.then(fn2)
.then(fn3)
}

fn1 の処理で場合によっては 残りを実行せずスキップしたいです

const fn1 = (value) => {
if(isOK(value)) {
return format(value)
} else {
return { skip: true }
}
}

{ skip: true } が return された場合は fn2 と fn3 を実行しないようにしたいです

方法 1

fn1 の結果で分岐するので then のチェーンも分岐させます

function f() {
return something().then(fn1).then(v => {
if(v && v.skip) return
else return fn2(v).then(fn3)
})
}

見やすさ的にはやりたくない方法です
自由度だけは高いのですけどね

async 関数にしてみると

async function f() {
const v = await something().then(fn1)
if(v && v.skip) return
return fn2(v).then(fn3)
}

ちょっとはすっきりしました

方法 2

Promise の機能を拡張という方法もとれます
これ専用というよりスキップ機能をもつ Promise を作るという方法です
{ skip: true } じゃなくてスキップを表す symbol で判断します

class Promise2 extends Promise {
static skip_symbol = Symbol("SKIP")
static skip(value) { return { [this.skip_symbol]: true, value } }

then(fn) {
return super.then(x => x && x[this.constructor.skip_symbol] ? x : fn(x))
}
}

const fn1 = (value) => {
if(isOK(value)) {
return format(value)
} else {
return Promise2.skip("skipped")
}
}

function f(){
return Promise2.resolve()
.then(something)
.then(fn1)
.then(fn2)
.then(fn3)
}

見やすく書けました
ただ Promise みたいなあちこちで作られるものを拡張すると扱いが難しいです
prototype で拡張してれば全体が変わるのであんまり考えなくていいですけど prototype まで変えるのはやりすぎ感があります

方法 3

then に渡す関数をラップします

const skippable = fn => x => x && x.skip ? x : fn(x)

function f(){
return something()
.then(fn1)
.then(skippable(fn2))
.then(skippable(fn3))
}

どこがスキップ可能かわかりますし わりといい気がします

どれがいい?

見た目のわかりやすさを考えると 3 が好きです

ただ 方法 2 や 3 は then のチェーンをした上で内部処理をスキップしています
些細なものですが関数呼び出しとスキップ確認を then の数だけ行っています
そういう意味では方法 1 の途中で return するほうが良いのかもしれません

実行用ダミー

実際に動かすための各種ダミーデータ

const something = async () => 1
let ok = 1
const isOK = v => ok === v
const format = v => `#${v}#`
const fn2 = async v => { console.log("fn2", v); return v }
const fn3 = async v => { console.log("fn3", v); return v }

ok = 1
f()
// fn2 #1#
// fn3 #1#

ok = 0
f()
// (出力なし)