私は開発中のAngularJSアプリケーションで、複数のアップロードされたファイルを非同期的に処理して、SuiteCRMインスタンスに追加するルーチンを準備します。全体的に、コードはバグがありませんが、私は遅延呼び出しが次々に実行され、すべての約束が解決されるまで待っているスクリプトに結果を渡していないことを発見しています。おそらく誰かが、私が望む結果を得るために、これらをつなぐ方法を教えてくれるでしょうか?結果を使用したAngularJSでの複数の非同期呼び出し
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);
});
});
}
}
};
だから、あなたが見る、私は私の$ scope.fileListにF(ファイル)ごとにcreateNewUploadedDocument関数にそれを渡すために、ファイルの内容を返し、ファイルを処理するためにFileReaderをする必要があります。 NGFの複数のファイルオプションは、これらのファイルのそれぞれに特定のテンプレートタイプと説明があるため、私には利用できません。
ご提供いただけるお手伝いがあれば、幸いです。
EDIT - 私はこのChaining multiple promises created through for loopと、このangular $q, How to chain multiple promises within and after a for-loopを読んだことがあるが、どちらも私の特定の状況のための任意の使用可能なフィードバックを提供しています。約束事は$ q.allを使って入れ子にして組み合わせることができますが、依然として結果データを互いに提供することはできますか? 私の内部メソッドは、REST APIの呼び出しです。何の違いもありませんが、呼び出すためにはFileReaderの約束の結果が必要です。
動作しない部分は何ですか?コードはちょっと面倒ですが、うまくいくはずですが、あなたが望む結果が何であるかをはっきりと把握していないので、手助けするのは難しいです。 –
これは、基本となる関数を呼び出す前に、すべてのfileReader約束をループします。 – DevlshOne
それはできません。最初の約束事が 'fileReader'から解決されたとき、それは最初の' .then() 'に続かなければなりません。それを止めることは何もないので、 '.then()'のいずれかに入る前にすべての約束を待っている場合は、ちょうど非論理的です。 –