Kątowa synchroniczna pętla http do aktualizacji paska postępu

Próbuję zaktualizować pasek postępu z sekwencyjnym żądaniem http wewnątrz foreach, to działa, ale nie jest synchroniczne po zakończeniu, pasek postępu jest synchronizowany przez połączenie http, co robię źle?

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);
        });
    }
});

Chciałbym wywołać funkcję update_progress tylko wtedy, gdy http powróci jako zakończone (200 OK), więc pasek postępu pokazuje poprawny postęp. Dzięki!

Edytować:

Próbowałem sprawdzić status odpowiedzi przed wywołaniem funkcji * update_progress * i nadal nie działa zgodnie z oczekiwaniami. Nie wiedziałem, że 200 zostało wysłane przed zakończeniem wniosku: | Według logikires obj nie powinien byćodpowiedź żądania http? To znaczy, jeśli jest to 200, a nie kod błędu, nie powinno to oznaczać, że żądanie zostało zakończone?

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);
        }
    });
}

Czytanie więcej na temat obietnic atm, aby sprawdzić, czy mogę sprawić, aby działało, jak stwierdził @ Josh-Strange

Edytuj 2:

Obietnice były sposobem na to, wszystkie żądania są wysyłane sekwencyjnie, więc pasek postępu działa zgodnie z oczekiwaniami, oto kod:

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();
});

Dzięki @ josh-dziwne

questionAnswers(2)

yourAnswerToTheQuestion