In ES6 this can be done by using generator functions. Personally I don't like generators because you can have many yields inside a *function while a standard function can have only one return statement.
+1 on generators, but for promises you could map over the array returning a promise operation for each element and use Promise#all (or Promise#settle if you're using Bluebird)