Ich habe eine ionische (v1) Projekt, das Winkel und Cordova verwendet. Ich bin eine Schleife von einem Array von Dateinamen und Anhängen jeder Datei Daten in einem FormData
Objekt, das auf den Server hochgeladen werden muss.Angularjs Versprechen nicht in Controller
Zum Lesen der Dateidaten bietet Cordova/HTML5
einige Methoden, die asynchron sind. Ich verwende Winkels $q
Versprechen für den Aufruf dieser Methoden.
Dann möchte ich $q.all
verwenden, um zu warten, bis alle Versprechen gelöst sind und den Upload starten.
Aber die Versprechen werden nie gelöst und der aufgelöste Funktionsblock innerhalb $q.all(promises).then
wird niemals aufgerufen.
Merkwürdig, wenn ich das Versprechen zurückweise, anstatt es mit deferred.reject
zu lösen, ruft es die Fehlermethode von $q.all
auf.
Wie löse ich das Versprechen? Hier
ist der Code:
//Inside a controller
var promises = [];
for (var key in $scope.rArray) {
if ($scope.rArray.hasOwnProperty(key)) {
var deferred = $q.defer();
var tmpFile = $scope.rArray[key];
var i = cordova.file.externalRootDirectory + "/" + tmpFile;
window.resolveLocalFileSystemURL(i, function(fileEntry) {
fileEntry.file(function(file) {
var reader = new FileReader();
reader.onloadend = function(e) {
console.log('onloadend callled');
var fileBlob = new Blob([this.result], { type:file.type});
fd.append('file', fileBlob,file.name);
deferred.resolve(fd); //if reject here it is reflected
//$rootScope.$apply(). tried this too
};
reader.readAsArrayBuffer(file);
}, function(e) {
console.log('error getting file', e);
deferred.reject(e);
});
}, function(e) {
console.log('Error resolving fs url', e);
deferred.reject(e);
});
promises.push(deferred.promise);
}
};
$q.all(promises).then(function (dataAr) {
console.log('promises resolved..'); //NEVER CALLED
var request = new XMLHttpRequest();
request.open('POST', ENV.baseUrl+"/st/st");
request.send(fd);
}, function errorfn(err) {
console.error(JSON.stringify(err));
})
aus Ihrer Beschreibung, es wie nicht alle Versprechungen gelöst sind - weshalb q.all niemals fortschreitet - wenn EINE Verheißung ablehnt, q.alle zurückweist, unabhängig vom Zustand der anderen Verheißungen –
'var deferred = $ q.defer();' ist das Problem. .. Der Wert von 'deferred' ist der LETZTE für jeden' deferred.resolve' Aufruf - so kann nur der letzte aufgelöst werden –