In Javascript you can make anything into a lazily evaluated expression by wrapping it into a function (sometimes called a "thunk").
// eager
new Promise(resolve => resolve(foo))
// lazy
const bar = () => new Promise(resolve => resolve(foo))
An executor would be something that takes n functions that return Promises and calls them.