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