2015-07-08 4 views
-1

Я думаю, что я идиот. Что здесь происходит?? Почему нет i: 0 или i: 1, только последний? Он показывает, что он циклически все и сразу после цикла пытается сохранить, и он сохраняет один и тот же последний объект много раз, и после этого я получу ошибку 500, дублирую ключ в БД. Можно ли даже сохранить объекты внутри цикла for :) в AngularJS?Цепные обещания в AngularJS

В console.log:

reasonList.length: 2 
rma.js: 284 i: 2 
rma.js: 285 defectdescDefectdescId: 2 
rma.js: 286 returnreasonId: 1 
rma.js: 287 rmaId: 15 

Код:

 savedRma = rmaService.save({}, rma); 
     savedRma.$promise.then(function (result) { 
      $scope.rma = result; 
      console.log('result.rmaID--------->' + result.rmaId); 
      saveReturnReason(result.rmaId); 
     }, function (error) { 
      alert('Error in saving rma' + error); 
     }); 
     $location.path('/rma-preview/' + $scope.rma.rmaId); 
     rmaDataService.setRma($scope.rma); 
    } 
}; // ELSE CREATE RMA END 
function saveReturnReason(rmaId) { 
    for (var i = 0; i < $scope.reasonList.length; i++) { 
     $scope.rmaHasDefectdesc.rmaHasDefectdescPK.defectdescDefectdescId = $scope.reasonList[i].defectdescId; 
     $scope.rmaHasDefectdesc.rmaHasDefectdescPK.returnreasonId = $scope.reasonList[i].returnreasonReturnreasonId.returnreasonId; 
     $scope.rmaHasDefectdesc.rmaHasDefectdescPK.rmaId = rmaId; 
     savedRmaHasDefectdesc = rmaDefectSvc.save({}, $scope.rmaHasDefectdesc); 
     savedRmaHasDefectdesc.$promise.then(function (response) { 
      $scope.savedRmaHasDefectdesc = response; 
      console.log('i: ' + i) 
      console.log('defectdescDefectdescId:' + response.rmaHasDefectdescPK.defectdescDefectdescId); 
      console.log('returnreasonId:' + response.rmaHasDefectdescPK.returnreasonId); 
      console.log('rmaId:' + response.rmaHasDefectdescPK.rmaId); 
     }, function (error) { 
      alert('Error in saving reasons' + error); 
     }); 
    } // For loop ending 
}; 

обновления для Foreach Я обновил цикл до Foreach. Тот же результат, не повезло. Все равно не собираюсь обещать. Затем вначале каждый, а затем пытается сохранить последнюю причину несколько раз.

function saveReturnReason(rmaId) { 
    $scope.reasonList.forEach(function(reason){ 
    $scope.rmaHasDefectdesc.rmaHasDefectdescPK.defectdescDefectdescId = reason.defectdescId; 
    $scope.rmaHasDefectdesc.rmaHasDefectdescPK.returnreasonId = reason.returnreasonReturnreasonId.returnreasonId; 
    $scope.rmaHasDefectdesc.rmaHasDefectdescPK.rmaId = rmaId; 
    console.log('rmaId: ' +rmaId+': returnReasonId: ' +reason.returnreasonReturnreasonId.returnreasonId +' defectID: '+reason.defectdescId); 

    savedRmaHasDefectdesc = rmaDefectSvc.save({}, $scope.rmaHasDefectdesc); 
    // At the first loop, never comes to .then 
    savedRmaHasDefectdesc.$promise.then(function (response) { 
     $scope.savedRmaHasDefectdesc = response; 

    }, function (error) { 
          alert('Error in saving reasons' + error.status); 
    }); 


    });// ForEach ending 

}; 
+1

Было бы лучше, если бы вы отформатировали этот код правильно. – Joseph

+0

Похож на типичную «асинхронную работу в цикле for», почему «i» показывает последний индекс вместо текущего внутри обратного вызова » –

+0

Пожалуйста, поделитесь лучшим форматированным кодом и выходом для этого кода. –

ответ

0

Scope i, так что он доступен только в цикле:

for (var i = 0; i < $scope.reasonList.length; i++) { 
    (function(i){ 
     $scope.rmaHasDefectdesc.rmaHasDefectdescPK.defectdescDefectdescId = $scope.reasonList[i].defectdescId; 
     $scope.rmaHasDefectdesc.rmaHasDefectdescPK.returnreasonId = $scope.reasonList[i].returnreasonReturnreasonId.returnreasonId; 
     $scope.rmaHasDefectdesc.rmaHasDefectdescPK.rmaId = rmaId; 
     savedRmaHasDefectdesc = rmaDefectSvc.save({}, $scope.rmaHasDefectdesc); 
     savedRmaHasDefectdesc.$promise.then(function (response) { 
      $scope.savedRmaHasDefectdesc = response; 
      console.log('i: ' + i) 
      console.log('defectdescDefectdescId:' + response.rmaHasDefectdescPK.defectdescDefectdescId); 
      console.log('returnreasonId:' + response.rmaHasDefectdescPK.returnreasonId); 
      console.log('rmaId:' + response.rmaHasDefectdescPK.rmaId); 
     }, function (error) { 
      alert('Error in saving reasons' + error); 
     }); 
    })(i) 
} // For loop ending 

Проблема, как другие люди упоминали, что ваш цикл завершается до того, как обещание будет сделано, так что к тому времени, когда вы утешать log i уже обновлен.

+0

ReferenceError: i не определен в строке (i) – Sami

Смежные вопросы