2016-12-27 13 views
2

私は関数の配列を持っています。各関数はajax呼び出しからpromiseを返します。

var promises = []; 
if (form.$valid) { 
    Object.keys($scope.Model.Data.FormFiles).forEach(function (key) { 
    var file = $scope.Model.Data.FormFiles[key]; 

    function uploadFile(){ 
     var deferred = $q.defer(); 
     var upload = Upload.upload({ 
      url: "/api/ir/funnelApi/UploadFile", 
      data: { file: file } 
     }); 

     upload.then(function (response) {       
       // do something 
       deferred.resolve(response.statusText); 
      }, function (error) { 
       deferred.reject(error.data); 
      }, function (evt) { 

     });    
     return deferred.promise; 
    }  

    promises.push(uploadFile); 
    }); 
} 

私がやっていることは、すべてのファイルが正常にアップロードされていれば何かをすることです。

$q.all(promises).then(function (responses) {      
    // do something 
}, function (errors) { 
    // if any of the file upload fails, it should come here 
}); 

しかし、問題は、Ajaxでを解雇しないと$q.allは常に関数配列を成功に移動しありません。

私は何をしていますか?

+0

'deferred.resolve(response.statusText);'の内部に入りますか?そこに 'console.log()'を入れてみてください –

+0

親の約束を解決するか、拒否しなければならないのですが、Ajaxリクエストコードを投稿することができます –

+0

どこからでもuploadFile関数が呼び出されないようです。あなたはその関数を呼び出す必要があります。 –

答えて

5

あなたが変更してみてください機能を呼び出すと返された約束

を押していない....配列に機能の参照を推進している。

promises.push(uploadFile()); 

promises.push(uploadFile); 

新しい約束を作成する$q.defer();is also an antipatternUpload.upload()がすでに約束を返すと、代わりにそれを返すことができます

+0

はい、あなたは正しいです –