Loop http síncrono angular para atualizar a barra de progresso

Eu estou tentando atualizar uma barra de progresso com uma solicitação http sequencial dentro de um foreach, isso funciona, mas não é síncrona por no completo, a barra de progresso está sendo sincronizada pela chamada http, o que estou fazendo de errado?

angular.forEach(queue, function (item) {
    if (item.uid) {
        d.item = item;
        $http({
            url: BASE_URL + 'upp', 
            method: 'post',
            data: d                  
        }).then(function(res){
            x++;
            update_progress((x/queue_count)*100);
        });
    }
});

Eu gostaria de chamar a função update_progress apenas quando o http retorna como concluído (200 OK), então a barra de progresso mostra o progresso real corretamente. Obrigado!

Editar:

Eu tentei verificar o status de resposta, antes de chamar a função * update_progress * e ela ainda não funciona como esperado. Eu não sabia que 200 foi enviado antes que a solicitação fosse concluída: | Por lógica, ores obj não deveria ser oresposta da solicitação http? Quer dizer, se é 200 e não um código de erro, isso não significa que a solicitação foi concluída?

angular.forEach(queue, function (item) {
if (item.uid) {
    d.item = item;
    $http({
        url: BASE_URL + 'upp', 
        method: 'post',
        data: d                  
    }).then(function(res){
        if(res.status == 200) {
          x++;
          update_progress((x/queue_count)*100);
        }
    });
}

Lendo mais sobre promessas atm para ver se eu posso fazê-lo funcionar como afirmado por @ josh-strange

Editar 2:

Então, as promessas eram a maneira de fazer isso, todas as solicitações são enviadas sequencialmente para que a barra de progresso funcione conforme o esperado. Aqui está o código:

var promise = $q.all({}); 
// Had to init $q.all with an empty obj, 'cause null was trowing errors

angular.forEach(queue, function(item){
  if (item.uid) {        
    promise = promise.then(function(){
      d.item = item;
      return $http({
        url: BASE_URL + 'upp', 
        method: 'post',
        data: d 
      }).then(function(res){
        x++;
        update_progress((x/queue_count)*100);
      });
    });
  }
});

promise.then(function(){
  end_js_update();
});

Obrigado @ josh-strange

questionAnswers(2)

yourAnswerToTheQuestion