encadeando promessas aninhadas em um loop

Sou um pouco novo nas promessas e estou preso no exercício a seguir.

Eu tenho uma matriz de valores e quero executar uma chamada assíncrona em cada um. No retorno de chamada, desejo executar outra chamada no resultado da primeira chamada.

Basicamente, minha frustração é a seguinte: A ordem de execução deve ser '1x2x3x', mas a ordem é '123xxx'

Em outras palavras, o loop já está indo para a próxima iteração quando a promessa sub / aninhada da primeira promessa ainda não foi concluída.

var values = ["1", "2", "3"];

function do(val) {
  var deferred = Q.defer();


  asyncCall(val)
  .then( function( response ) {
    console.log(val); 
    asyncCall(response)
    .then( function ( response ) {
      console.log('x');
      deferred.resolve(true)
    });
  });

  return deferred.promise;
}

var result = do(values[0]);

values.forEach( function(f) {
  result = result.then(do(f));
}

Provavelmente existe uma solução fácil, mas estou preso a ela.

questionAnswers(1)

yourAnswerToTheQuestion