Ah, roger that. I see the problem now, Roll20 never returns anything from the startRoll() when there's a @{selected} error, so the await becomes blocking. There is a way around that, though whether or not you consider it useful is another matter :) If we still call startRoll() as async, but don't await the result, we can manually wait for a certain amount of time to see if it returns anything. Having a manual timer in here would be a real issue for a super important roll, but the worst case here on a failure is that the player needs to manually select instead of the sheet automatically using the {selected}. I did a very quick test to make sure this worked, and 50ms seemed to be about right for the timeout - ymmv of course, and you might want a big error margin. Anyways, here's the code: // Promisified setTimeout const aTimeout = async ( ms ) => new Promise ( res => setTimeout (() => { res ()}, ms )); const getSelected = async () => { const rxGrab = / ^ 0 \[ ( . * ) \] \s * $ / ; let rollBase = `! {{charid=[[0[@{selected|character_id}]]] }}` ; let selectedRoll , selectedResponse ; startRoll ( rollBase ). then ( v => selectedRoll = v ); // Manually wait for a result with an async timeout console . log ( `Start timeout` ); await aTimeout ( 50 ); console . log ( `Leave timeout` ); // Process result if the .then() block above has had time to finish if ( selectedRoll ) { selectedResponse = ( selectedRoll . results . charid . expression . match ( rxGrab ) || [])[ 1 ]; console . log ( selectedResponse ); finishRoll ( selectedRoll.rollId ); } else console . log ( `Nothing selected...` ); return selectedResponse ; }; const testRoll = async () => { let val = await getSelected (); if ( val ) console . log ( `Proceeding with {selected} roll` ); else console . log ( `Proceeding with {target} roll` ); } on ( 'clicked:reptest' , testRoll ); Pretty similar setup, except the await is removed from the startRoll, and we use a .then() block to unwrap the promise if it returns anything. We don't even get the benefit of startRoll's 5 second timer here as far as I can tell - Roll20 doesn't give us peanuts if the {selected} roll fails. So feed whatever number you want into the timeout block, the code will then proceed and if the .then() has executed during the timeout, we'll have a selectedRoll to process, otherwise undefined. The rest of your code can continue as usual. Now that I look at it, if I was going to use this trick in a few places it would be a nice place to use Promise.race() ... Oh, and this does nothing for the Roll20 "nothing selected" error - it only appears for the player clicking the button, but I don't think you can suppress it without a CSS extension like Stylus.