Fala Vítor!
Você pode usar Async/Await do ES7, veja um exemplo:
Supondo que você tenha um array de itens e você queira performar determinada operação em cada item de forma que uma não inicie a não ser que anterior seja terminada.
Repare que fn
retorna uma promise
async function processaArray(array, fn) {
let resultados = [];
for (let i = 0; i < array.length; i++) {
let r = await fn(array[i]);
resultados.push(r);
}
return resultados; // valores resolvidos das promises
}
// exemplo de uso
processaArray(arr, processaItem).then(function(resultado) {
// tudo é feito aqui
// array de dados em resultado
}, function(razao) {
// rejeição
});
Existem outras formas de se fazer, utilizando reduce
por exemplo, mas acredito que utilizando Async/Await seja a mais 'atual'
Espero ter ajudado!
Abraços.