So after a little digging, I couldn’t find an elegant solution, but I did find a frustrating one:
Write Modern Asynchronous Javascript using Promises, Generators, and Coroutines
William Gottschalk
27510

Hmm why not use Promise.all here? then(userData => all([permissions.findAllAsync, userData])) and rename permissions argument to something that would be meaningful [permissions, userData]

No need for nested promises.