[英]How to use angularjs $q.all() with an asynchronously created array of promises
我正在嘗試使用$ q.all()等到一堆承諾被解決。 為此,我創建了一個promises數組,並將其傳遞給all()方法,但這似乎不起作用。 promises數組由$ resource對象返回的promise填充,它們是在每次迭代中創建的,我認為這是問題所在,因為promises數組是異步填充的。
我之所以得出這個結論,是因為$ q.all()方法返回的promise,promise數組始終是一個空數組。 就像$ q.all()方法不等待數組被填滿。 但是我不確定這是否是問題。
在這件事上,我將不勝感激,如果無法通過$ q.all()實現我想要的功能,我想在解決所有承諾后,看看其他執行代碼的方法。
這是我目前正在使用的代碼
var promisesArray = [];
var images, postObject;
files.readFile('images.txt')
.then(function (data) {
images= angular.fromJson(data);
images.forEach(function (image, idx) {
var deferred = $q.defer();
if (!image.sent) {
files.readFile(image.name)
.then(function (data) {
postObject = angular.fromJson(data);
$resource(EndPointsService.baseURL + "images").save(postObject, function(data) {
deferred.resolve(data);
if (data.status) {
image.sent= true;
}
},function(error){
console.log(error);
});
promisesArray.push(deferred.promise);
},function(error){
console.log(error);
});
}
});
$q.all(promisesArray).then(function (data) {
console.log(data);
files.writeFile("images.txt", images)
.then(function (data) {
console.log(data);
}, function (error) {
console.log(error);
});
});
},function(error){
console.log(error)
});
promise的.then
方法從返回給它的數據中返回一個新的promise。
創建內部的承諾陣列.then
方法返回的$q.all
承諾到.then
方法:
̶v̶a̶r̶ ̶p̶r̶o̶m̶i̶s̶e̶s̶A̶r̶r̶a̶y̶ ̶=̶ ̶[̶]̶;̶
var images, postObject;
var arrayPromise = files.readFile('images.txt')
.then(function (data) {
͟v͟a͟r͟ ͟p͟r͟o͟m͟i͟s͟e͟s͟A͟r͟r͟a͟y͟ ͟=͟ ͟[͟]͟;͟
images= angular.fromJson(data);
images.forEach(function (image, idx) {
̶v̶a̶r̶ ̶d̶e̶f̶e̶r̶r̶e̶d̶ ̶=̶ ̶$̶q̶.̶d̶e̶f̶e̶r̶(̶)̶;̶
if (!image.sent) {
var promise = files.readFile(image.name)
.then(function (data) {
postObject = angular.fromJson(data);
var url = EndPointsService.baseURL + "images"
͟r͟e͟t͟u͟r͟n͟ $resource(url).save(postObject).$promise;
});
promisesArray.push(promise);
};
});
͟r͟e͟t͟u͟r͟n͟ $q.all(promisesArray);
});
arrayPromise.then(function (dataArray) {
console.log(dataArray);
//Process data here
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.