2016-08-05 4 views
1

JavaScript closuresでもAngularJS promisesでも多くの経験はありません。だから、ここに私のシナリオがあるAngularJSで約束のあるクロージャを使用

目標

私は$httpリクエストを行う必要があるが、ループが実行されていても(明らかな)問題

forループ内

を呼び出します私の変数はまだ更新されていません

現在の実装精神作用

function getColumns(fieldParameters) 
{ 
    return $http.get("api/fields", { params: fieldParameters }); 
} 

for(var i = 0; i < $scope.model.Fields.length; i++) 
{ 
    var current = $scope.model.Fields[i]; 

    (function(current){ 
     fieldParameters.uid = $scope.model.Uid; 
     fieldParameters.type = "Columns"; 
     fieldParameters.tableId = current.Value.Uid;      
     var promise = getColumns(fieldParameters);     
     promise.then(function(response){ 
      current.Value.Columns = response.data; 
     }, error); 
    })(current);                  
} 

//at this point current.Value.Columns should be filled with the response. However 
//it's still empty 

私はこれを達成するために何ができますか?

おかげ

答えて

1

私が正しくあなたの質問を理解していれば、あなたは上のいくつかの作業を行う必要があるフィールドのリストを持っています。その後、すべての非同期作業が完了したら、続行します。だから、$ q.all()を使うことはすべきことです。それは、それに引き渡される約束のリストがすべて解決されたときに解決されます。あなたは右を見ていないので、これを試してみてください

var promises = []; 

for(var i=0; i< $scope.model.Fields.length; i++) { 
    var current = $scope.model.Fields[i]; 
    promises.push(getColumns(fieldParameters).then(function(response) { 
    current.Value.Columns = response.data; 
    })); 
} 

return $q.all(promises).then(function() { 
    // This is when all of your promises are completed. 
    // So check your $scope.model.Fields here. 
}); 

EDIT:だから、「このようなもののすべてが終了するまで待機し、その後、これを行う」本質的に同じよう

をあなたはこのような何かを試すことができますアイテムが更新されました。フィールドを受け入れるようにgetColumnsメソッドを更新し、getColumns呼び出しでフィールドを送信します。

function getColumns(fieldParameters, field) 
{ 
    return $http.get("api/fields", { params: fieldParameters}).then(function(response) { 
field.Value.Columns = response.data; 
    }); 
} 


... 

promises.push(getColumns(fieldParameters, $scope.model.Fields[i])... 
+1

しかし、データは正しい 'current'オブジェクトに更新されていません。だから私はここに閉鎖が必要だと思う。私は部分的な答えのためにあなたをアップアップするつもりです。 –

+0

@LuisLavieri上記の私の編集を参照してください。私はそのトリックを行うべきだと思います。 – peterholcomb

+1

ありがとうございます。それはとても近かった。私は気をつけて 'i'を渡し、最後に' $ http'の中に 'fieldParameter'オブジェクトを埋めなければなりませんでした。 –

1
var promises = [];  

    for(var i = 0; i < $scope.model.Fields.length; i++) 
    { 
    var current = $scope.model.Fields[i]; 
    promises.push(function(current){ 
     //blahblah 
     return promise 
    }); 
    } 


    $q.all(promises).then(function(){ 
     /// everything has finished all variables updated 
    }); 
+1

データは右の 'current'オブジェクトに更新されていません。だから私はここで閉鎖が必要だと思うのです。しかし、私はまだ部分的な答えのためにあなたをupvoteしようとしています。ありがとう –