1

現時点でこれに本当に苦労しているので、誰かが素晴らしいアドバイスを持っていれば. シンプルなものを複雑にしすぎているのは確かですが、見てみましょう。

以下を使用してファイルをサーバーにアップロードします

https://github.com/nervgh/angular-file-upload/wiki/Module-API

特定の種類のファイル用にファイル アップローダーのインスタンスをいくつか作成しています (それぞれに異なるアップロード URL が必要なため、1 つだけを使用することはできません)。

だから私は次のようなリストを持っています

var uploaders = [a list of file object uploaders]

私がやりたいことは、リストを繰り返し処理し、それぞれを呼び出しuploadAll()、それぞれのファイルがアップロードされたら、スクリプトを続行することです。

uploadAll問題は、関数が を実装しているとは思わないpromiseため、次のコードを試すと、ファイルが正常にアップロードされる前に残りのスクリプトが続行されることです。

これが私が持っているものです

var deferred = $q.defer();

var uploaders = [my list of object uploaders]

var allUploads = uploaders.map(function(uploaders) {
    var singleUploadPromise = uploaders.uploadAll();
    return singleUploadPromise;
}); 



$q.all(allUploads).then(function() {    
    console.log('Finished uploading all files')
    deferred.resolve('Finished uploading all files');
}, function(error) {
    deferred.reject(error);
});

return deferred.promise;

ファイルはアップロードされますが、スクリプトの残りの部分はアップロード前に実行されます。私が

console.log(allUploads)

アイテムのリストを取得しundefinedます。明らかに私はここで間違っていますが、どのように前進するかについては確信が持てません.

4

2 に答える 2

1

ファイル アップローダのコードを見ると、.uploadAll() は何も返しませんが、コールバック .onCompleteAll() があります。したがって、各アップローダによる uploadAll() への呼び出しのコールバック関数で解決する遅延オブジェクトを作成できます。

        var uploaders = [my list of object uploaders];

        var allUploads = uploaders.map(function(uploader) {
            // you need one deffered object per uploader
            var deferred = $q.defer();

            // set up an onCompleteAll callback for each uploader
            uploader.onCompleteAll = function() {
                deferred.resolve('onCompleteAll');
            };

            // call uploadAll on each uploader
            uploader.uploadAll();

            return deferred;
    }); 


    var combinedUploads = $q.all(allUploads).then(function() {    
            console.log('Finished uploading all files');
    }, function(error) {
            console.log('error!');
    });

    return combinedUploads.promise; // assuming this was in another function
于 2016-01-21T17:49:47.643 に答える