2016-08-05 37 views
1

我對JavaScript closuresAngularJS 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. 
}); 

編輯:

試試這個,因爲你看不到正確的項目已更新。更新你的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

它可以工作,但是數據沒有被更新到正確的'當前'對象。這就是爲什麼我認爲我需要在這裏關閉。無論如何,我會反過來爲你提供部分答案。 –

+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

它可以工作,但是數據沒有被更新到正確的'當前'對象。這就是爲什麼我認爲我需要在這裏關閉。但是,我仍然會贊成你的部分答案。謝謝 –