HiveBrain v1.2.0
Get Started
← Back to all entries
patternjavascriptMinor

Iterating through a range using lodash/AngularJS and saving data

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
angularjslodashiteratingrangedatausingthroughandsaving

Problem

The code below doesn't seem right to me. The scenario is:

  • User enters in a "quantity" into a form field.



  • If the user enters in 5, the loop below should iterate 5 times.



  • There should now be 5 new entries in the database with the container.product and container.status.



Any advice on making this cleaner?

var container = new Container($scope.batchFields);

container.product = $scope.item.originalObject._id;
container.status = 'active';

_.each($scope.batchFields, function(batch) {
  _.each(_.range(batch.batchesQuantity, 0, -1), function (val,i) {

    // This $save code smells a little with it 
    // being inside the _.each.
    container.$save(function(response) {
      $notify.success('purchase.order.edit.created');
      if ($scope.$close) {
        $scope.$close();
      }
    }, function(errorResponse) {
      $scope.errors = errorResponse.data.message;
    });
  });

});

Solution

Please do not make separate calls (Http requests) for saving each container,as this will affect the web application performance. Instead batch the calls ( 5 calls at one time). Store them in an array and make a single call

_.each($scope.batchFields, function(batch) {
  var containersList = [];
  _.each(_.range(batch.batchesQuantity, 0, -1), function(val, i) {

    // store them in the array
    containersList.push(new Container($scope.batchFields));
  });

  $http.post('saveContainers', containersList).then(function(response) {
    $notify.success('purchase.order.edit.created');
    if ($scope.$close) {
      $scope.$close();
    }
  }, function(errorResponse) {
    $scope.errors = errorResponse.data.message;
  });

});

Code Snippets

_.each($scope.batchFields, function(batch) {
  var containersList = [];
  _.each(_.range(batch.batchesQuantity, 0, -1), function(val, i) {

    // store them in the array
    containersList.push(new Container($scope.batchFields));
  });


  $http.post('saveContainers', containersList).then(function(response) {
    $notify.success('purchase.order.edit.created');
    if ($scope.$close) {
      $scope.$close();
    }
  }, function(errorResponse) {
    $scope.errors = errorResponse.data.message;
  });

});

Context

StackExchange Code Review Q#97532, answer score: 2

Revisions (0)

No revisions yet.