角度とコードを使用するionic(v1)プロジェクトがあります。 ファイル名の配列をループし、各ファイルデータをFormData
オブジェクトに追加します。このオブジェクトはサーバーにアップロードする必要があります。Angularjsはコントローラで解決されないと約束します
ファイルデータを読み込むために、Cordova/HTML5
には非同期のメソッドがいくつかあります。私はこれらのメソッドを呼び出すための角度の$q
を使用しています。
次に、すべての約束が解決するまで待ってからアップロードを開始するには、$q.all
を使用します。
しかし、約束は決して解決されず、$q.all(promises).then
の解決された機能ブロックは決して呼び出されません。
私が約束を拒否する代わりに、deferred.reject
と解決するのではなく、エラーメソッド$q.all
を呼び出します。
私は約束をどのように解決しますか?ここで
は、コードは次のとおりです。
//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));
})
あなたの説明から、それが見えますすべての約束が解決されたわけではない - それで、q.allは決して進歩しない - なぜなら、約束が拒否されたとき、q.allは他の約束の状態にかかわらず拒否する。 –
'var deferred = $ q.defer();'が問題である。 .. 'deferred'の値はすべての' deferred.resolve'呼び出しのLAST ONEになります - 最後のものだけを解決することができます –