簡體   English   中英

在循環完成后以延遲方式返回數據時,如何在for循環中更新數據

[英]How can I update data in a for loop when my data is returned with a defer after the loop completes

我有兩個數組:

$scope.grid.data and $scope.grid.backup

我使用以下腳本來一次比較每個元素中的數據:

for (var i = 0, len = $scope.grid.data.length; i < len; i++) {
    if (!angular.equals($scope.grid.data[i], $scope.grid.backup[i])) {
        var rowData = $scope.grid.data[i]
        var idColumn = $scope.entityType.toLowerCase() + 'Id';
        var entityId = rowData[idColumn];
        entityService.putEntity($scope.entityType, entityId, $scope.grid.data[i])
            .then(function (result) {
                angular.copy(result, $scope.grid.data[i]);
                angular.copy(result, $scope.grid.backup[i]);
            }, function (result) {
                alert("Error: " + result);
            })
    }
}

然后執行以下操作以更新數據庫:

putEntity: function (entityType, entityId, entity) {
    var deferred = $q.defer();
    EntityResource.putEntity({ entityType: entityType, entityId: entityId }, entity,
       function (resp) {
           deferred.resolve(resp);
       }, function (resp) {
        deferred.reject('Error updating');
    });
    return deferred.promise;
}

該腳本正確地注意到更改並更新數據庫。

但是,當putEntity返回結果並嘗試將結果復制到$ scope.grid.data [i]和$ scope.grid.backup [i]時,會出現問題。

這種情況稍后發生,並且在嘗試執行此操作時,總是嘗試將其放入元素11中。

有誰知道我如何確保從putEntity返回的數據被復制回grid.data和grid.backup數組的正確元素中?

您需要在i上創建一個閉包。 您可以做的就是創建一個函數

var updateGridData=function(entityType, entityId, gridDataToUpdate, gridIndex) 
entityService.putEntity(entityType, entityId,gridDataToUpdate)
            .then(function (result) {
                angular.copy(result, $scope.grid.data[gridIndex]);
                angular.copy(result, $scope.grid.backup[gridIndex]);
            }, function (result) {
                alert("Error: " + result);
            })

}

所以你的主要方法變成

for (var i = 0, len = $scope.grid.data.length; i < len; i++) {
    if (!angular.equals($scope.grid.data[i], $scope.grid.backup[i])) {
        var rowData = $scope.grid.data[i]
        var idColumn = $scope.entityType.toLowerCase() + 'Id';
        var entityId = rowData[idColumn];
        updateGridData($scope.entityType, entityId, $scope.grid.data[i],i);
    }
}

您可以從這個問題中了解更多關於循環內JavaScript閉合的想法–簡單的實際示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM