Resolver promessas uma após a outra (ou seja, em sequência)?

Considere o código a seguir que lê uma matriz de arquivos de maneira serial / seqüencial. readFilesretorna uma promessa, que é resolvida apenas quando todos os arquivos foram lidos em sequência. var readFile = function(file) { ... // Returns a promise. }; var readFiles = function(files) {...