Я знаю, что это старый вопрос, но в последнее время ситуация немного изменилась.
Если вы в порядке с использованием внешних библиотек, библиотека обещаний Bluebird имеет довольно хорошую реализацию для этого: Promise.each .
Например,
function helperFunc(zippyarray) {
return Promise.each(zippyarray, zippy => {
return someOperationThatReturnAPromise(zippy)
.then((singleResult) => {
// do something with the operation result if needed
})
}).then((originalArray) => {
// this happens only after the whole array is processed
// (result is the original array here)
return Promise.resolve(originalArray)
})
}