2016-11-25 7 views
0

2つのリクエストが完了した後に関数を呼び出す必要があります。だから私は$ q.allを使ってこれを試みます。私はAngularのサービスを持っています。それはsubmitFormを呼び出す前に2つの別の要求を行う必要があり、応答後にフォームを送信するための投稿要求を行います。 $q.all

submitForm : function(form, params) { 
    var self = this; 
    var callback = function() { 
     // this is submit post req 
    }; 

    angular.forEach(form, function(item) { 
     // I search tables (type of field) and then send req for saving tables on backend 
     self.uploadTables(item) 
    }) 

    this.uploadFiles(params).then(callback) 

    } 
    uploadFiles : function(params) { 
    // this func upload files before submit 
    } 
    uploadTables : function(params) { 
    // for uploading tables I have another service on backend, so I need another request, before submit 
    } 

私は$q.all(this.uploadFiles, this.uploadTables)ようにそれを呼び出す必要が推測:それはこのようになりますか?しかし、私はそれを行うことはできませんアップロードTables私はforEachを呼び出します。 uploadFilesとuploadTablesの完了後にコールバック関数を呼び出すにはどうすればよいですか?

+0

あなたは 'forEach'を使用しません。代わりに 'map'を使います。 – Bergi

答えて

3
var promises = []; 
angular.forEach(form, function(item) { 
     promises.push(self.uploadTables(item).then(uploadTableCallback)); 
}) 
promises(this.uploadFiles(params).then(uploadFilesCallback)); 
$q.all(promises).then(allCallback) 

私は$のq.allで特別な何もないことに気づくこともしたいとあなたは常にそれを手動で行うことができます。

var promisesToResolve = arr.length; 
var promisesResolve = 0; 
    angular.forEach(arr, function(obj) { 
      $http.post(obj).then(function() { 
       promisesResolve++; 
       if (promisesResolve == promisesToResolve) { 
        // all resolved 
       } 
      }) 
    }) 
+1

あなたの$ q.allの実装は間違っています。つまり、約束の1つが拒​​否されれば、それは永久にハングします。また、結果を収集しません。 –

+0

さらに、 'arr.reduce((p、c)=> p.then(v => c)、$ q.resolve())'と同様の結果を収集するようになりました。おそらく@Benjamin Gruenbaum @ –

+0

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@、私は$ qからの不合格を処理して "ハングスを永遠に"解決する必要がありますか?これは私のための作品です – YoroDiallo

-1

あなたが戻って配列に約束を収集することができ

var promises = []; 


angular.forEach(form, function(item) { 

    var deferred = $q.defer(); 
    //do your code 
    deferred.resolve(result); 

    promises.push(deferred.promise); 
}); 

// execute all the promises and do something with the results 
$q.all(promises).then(

    function(results) { 
     //do your stuff 
    }, 
    // error 
    function(response) { 
    } 
); 
関連する問題