I spent a little time in a Promise rabbit-hole today, and thought I'd share two rules-of-thumb that I came up with to avoid such holes in the future. This came from writing Mocha tests, but it applies to lots of code:
Example:
describe('Some Async Test', () => {
var myPromise;
before('Do some async setup', () => {
myPromise = doSomethingAsync();
return myPromise;