Решение $q.all
разрешается, прежде чем любая из его функций разрешится.
Я загрузки двух файлов в лазурной хранения больших двоичных объектов с помощью $ .ajax (я не мог получить $ HTTP работать):
function doPhotos (result, i)
{
var d = $q.defer();
var requestData = new Uint8Array($scope.files[i].postArray);
$.ajax({
url: result.photos[i].imageUri,
type: "PUT",
data: requestData,
processData: false,
beforeSend: function (xhr)
{
xhr.setRequestHeader('x-ms-blob-type', 'BlockBlob');
xhr.setRequestHeader('x-ms-blob-content-type', $scope.files[i].type);
xhr.setRequestHeader('x-ms-meta-uploadvia', 'CORS Demo');
xhr.setRequestHeader('Content-Length', requestData.length);
},
success: function (data, status)
{
d.resolve(data);
},
error: function (xhr, desc, err)
{
console.log('error uploading photo ' + desc);
d.resolve(err);
}
});
return d.promise;
}
Это функция, которая устанавливает $q.all
и вызывается на ng-click
:
$scope.createVotation = function() {
services.photoset.create($scope.model).then(function (result) {
$scope.model.id = result.id;
var doPhotosArray= [];
for (var i in result.photos) {
doPhotosArray[i] = doPhotos(result, i);
}
$q.all(doPhotosArray).then(function (data)
{
// this is being called almost immediately before the photos upload
$scope.safeApply(function()
{
$scope.submitting = false;
$location.path('/vote/update/' + $scope.model.id);
});
});
});
}
};
HTML:
<button ng-click='createVotation()'>Create</button>
q.all->then
вызывается до того, как вызывается даже первое решение doPhoto
. Я не уверен, есть ли проблема с использованием jQuery ajax, но я понимаю, что $q.all
должен дождаться, пока обе обещания (в моем случае есть 2) не будут выполнены до ввода then
.
Как добавленный поворот, фотографии загружаются так, что это работает, это $q.all
, что не ждет.
Должно работать нормально. См. Эту демонстрацию, которая увеличивает задержку в 1/2 секунды для разрешения 4 запросов. http://plnkr.co/edit/Zawd6dBZh6FlRPD0gsrV?p=preview – charlietfl
Проверьте этот плункер: http://plnkr.co/edit/XpGMfak4hzTKic8R3wdR?p=preview q.all никогда не решает, хотя обе функции выполняются. Хотя другой вопрос, чем мой первоначальный вопрос, не уверен, почему он ведет себя таким образом. Я пробовал это с и без таймаута, чтобы имитировать пару секунд. – lucuma
очень странно ... почти такая же концепция, как и моя демонстрация .... не могу понять, почему она не срабатывает – charlietfl