AngularJS中的链式承诺

时间:2015-07-08 17:49:04

标签: javascript angularjs save angular-promise angular-resource

我认为我是个白痴。这里发生了什么?为什么没有i:0或i:1,只是最后一个?它显示它循环所有内容,并且在循环之后它尝试保存并且它多次保存相同的最后一个对象,之后我将获得错误500,DB中的重复键。甚至可以在AngularJS中保存for循环中的对象吗?

在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更新 我更新了for循环到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 个答案:

答案 0 :(得分:0)

范围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

其他人提到的问题是你的循环在承诺完成之前完成,所以当你控制日志时i已经更新。

相关问题