$q.all
在其任一功能解决之前就已解决。
我使用$ .ajax将两个文件上传到azure blob存储空间(我无法使$ 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
应该等到两个promises(在我的情况下有2个)在进入then
之前完成。
作为一个额外的转折,照片 正在上传,以便正常工作,$q.all
正在等待。
答案 0 :(得分:1)
在做了一些研究并考虑了@charlietfl的各种注释后,我能让$ q.all正常工作的唯一方法就是将函数调用赋给变量然后将其推送到正在进行的数组中传递到q.all。
for (var i in result.photos)
{
var output = doPhotos(result, i);
doPhotosArray.push(output);
}
我用于参考的各种示例似乎表明我原始问题中的代码应该有效,但却没有。