В приложении AngularJS, которое я разрабатываю, я пытаюсь асинхронно обработать несколько загруженных файлов, чтобы подготовить их к подпрограмме, которая добавляет их в экземпляр SuiteCRM. В целом код не содержит ошибок, но я обнаружил, что отложенные вызовы выполняются один за другим и не передают результат ожидающему сценарию до тех пор, пока не будут выполнены все промисы. Возможно, кто-то может помочь мне с тем, как связать их, чтобы получить результат, который я хочу?
function fileReader(file) { // perform async operation
var deferred = $q.defer();
var reader = new FileReader();
reader.onload = function () {
deferred.resolve(reader.result.replace(/^(.*),/g, ""));
};
reader.readAsDataURL(file);
return deferred.promise;
}
$scope.uploadFiles = function () {
console.log('Starting uploads');
$scope.uploadClicked = true;
$scope.uploadProgress = {};
$applicationID = $('#application_id').val();
var tmpMerchData = SessionService.getMerchantData();
var isoID = SessionService.getISOID();
if ($scope.fileList && $scope.fileList.length) {
var $myFiles = $scope.fileList;
for (var f = 0; f < $myFiles.length; f++) {
var thisFile = $myFiles[f];
console.debug(thisFile);
fileReader(thisFile.file).then(function (result) {
ApplicationFactory.createNewUploadedDocument(thisFile, thisFile.templatetype, result, thisFile.description, $scope.userID, tmpMerchData.id, $applicationID, isoID).then(
function successCallback(response) {
if (response.data.status === 1) {
console.log("Document creation succeeded");
$scope.uploadProgress = {
'progress': 100,
'index': f
};
} else {
console.log("Document creation failed");
}
}, function errorCallback(response) {
console.debug("Error returned from createNewUploadedDocument", response);
});
});
}
}
};
Итак, вы видите, мне нужно, чтобы FileReader обрабатывал файл, возвращал содержимое файла, чтобы передать его функции createNewUploadedDocument для каждого из f (файлов) в моем $scope.fileList. Параметр нескольких файлов NGF недоступен для меня, потому что каждый из этих файлов имеет определенный тип шаблона и описание.
Любая помощь, которую вы можете предоставить или предложить, будет принята с благодарностью.
EDIT - я прочитал это Объединение нескольких промисов, созданных с помощью цикла for, и этого angular $q, Как связать несколько промисов внутри и после цикла for, но ни один из них не дает полезной обратной связи для моей конкретной ситуации. Я понимаю, что промисы могут быть вложены и объединены с помощью $q.all, но могут ли они по-прежнему передавать полученные данные друг другу? Мой внутренний метод - это вызов REST API - не то, чтобы это имело какое-либо значение, но мне нужен результат обещания FileReader, чтобы вызвать его.
.then()
, когда первое обещание разрешается изfileReader
. Ничто не мешает ему продолжать, поэтому тот случай, когда он будет ждать всех промисов перед вводом любого из.then()
, просто нелогичен. - person Daniel B   schedule 25.01.2017fileReader
, а затем предоставляет только последнийresult
для.then()
. Как бы нелогично это ни казалось (и я думал, что код должен работать так, как он написан)! - person DevlshOne   schedule 25.01.2017