class AudioContexthehe { state = "suspended" constructor() {} resume() { return new Promise((resolve, reject) => { this.state = "running" resolve() }) } } class AudioElementHehe { constructor() {} play() { return new Promise((resolve, reject) => { console.log("playing!") resolve() }) } pause() { console.log("Pausing!") } } const audio_context = new AudioContexthehe() const audio_element = new AudioElementHehe() let is_playing = false try_play_toggle_async() function try_play_toggle_async() { return new Promise((resolve, reject) => { if (audio_context.state !== "running") { audio_context.resume().catch((e) => reject(e)) } if (audio_element.paused) { audio_element.play().then( (s) => { is_playing = true resolve(s) }, (r) => { is_playing = false reject(r) } ) } else { audio_element.pause() is_playing = false resolve(null) } }) }