我正在嘗試使用$ q.all()等待一堆promises解決。爲此,我創建了一個Promises數組,並將其傳遞給all()方法,但這似乎不起作用。 Promises數組充滿了$ resource對象返回的promise,這是在每次迭代中創建的,我認爲這是問題,因爲promises數組是異步填充的。
我已經得出這個結論,因爲$ q.all()方法返回的承諾數組,承諾數組始終是一個空數組。這就像$ q.all()方法不會等待數組填滿。但我不確定這是否是問題。我真的很感謝在這個問題上的任何幫助,如果不可能通過$ q.all()實現我想要的,我希望看到其他解決所有promise後執行代碼的其他方法。
這是我目前使用的
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)
});
你應該推承諾的承諾陣列異步'readFile'通話之外。你已經在上面創建了延遲,所以你可以將它添加到數組中。 – anson
當你說我應該「把它放在那裏」時,你的意思是在延期申報後的下一行中? –
那麼,從技術上講,你是在if語句之上創建延遲。所以如果這個條件是錯誤的,你已經創建了一個沒有理由的延期。您應該將延遲創建和添加到該條件內的數組。 – anson