2015-08-05 1 views
1

Я пытаюсь отправить массив обещаний в экспресс-приложение, чтобы получить данные из базы данных mongo. Кажется, он ведет себя правильно на переднем конце. В этом примере оба объекта отправляются на сервер и разрешаются с помощью $ q.all. Но поскольку я отлаживаю сервер, я вижу, что оба объекта одинаковы. В этом случае это последнее обещание с payload2, которое разрешается 2 раза. Если я добавлю больше обещаний, то правильное число будет разрешено, но все они являются значениями из последнего объекта в массиве.Попытка отправить угловой динамический массив обещаний выразить сервер

var promises = logCspItemInventoryStatus(payload,result.cspItems); 

    return $q.all(promises) 
     .then(function(result){ 
      toastr.success('Items have been logged'); 
     }) 
     .catch(function(err){ 
     toastr.error(err); 
     }) 

var logCspItemInventoryStatus = function (payload,cspItems) { 
    var promises = []; 
    angular.forEach(cspItems, function(item){ 
      //I am appending payload with items 
      payload.qty=item.checking; 
      payload.description=item.description; 

      //payload 1 {docId: "55c124f7485684e81d6181fc", by: "Foo Bar", checkIn: false, qty: 2, description: "car"} 
      //payload 2 {docId: "55c124f7485684e81d6181fc", by: "Foo2 Bar2", checkIn: false, qty: 1, description: "hall"} 

      var p = checkOutCspItem(payload); 
      promises.push(p); 
    }); 

    return promises; 
}; 

//returns a promise 
var checkOutData = function(payload) { 
    return Csp.update(payload).$promise.then(function(result) { 
    return result.data 
    }); 
    } 

ответ

1

Причина в том, что вы сохранили изменения полезной нагрузки из параметров, который является объектом и, таким образом, передается по ссылке, поэтому каждый раз, когда вы измените его он изменяет все ссылки на него, в том числе и тех, которые уже добавлены в массив обещаний ,

var promises = logCspItemInventoryStatus(payload,result.cspItems); 

    return $q.all(promises) 
    .then(function(result){ 
     toastr.success('Items have been logged'); 
    }) 
    .catch(function(err){ 
    toastr.error(err); 
    }) 

var logCspItemInventoryStatus = function (payload,cspItems) { 
var promises = []; 
angular.forEach(cspItems, function(item){ 
     //I am appending payload with items 
     var payloadCopy = angular.copy(payload); 
     payloadCopy.qty=item.checking; 
     payloadCopy.description=item.description; 

     //payload 1 {docId: "55c124f7485684e81d6181fc", by: "Foo Bar", checkIn: false, qty: 2, description: "car"} 
     //payload 2 {docId: "55c124f7485684e81d6181fc", by: "Foo2 Bar2", checkIn: false, qty: 1, description: "hall"} 

     var p = checkOutCspItem(payloadCopy); 
     promises.push(p); 
}); 

return promises; 
}; 

//returns a promise 
var checkOutData = function(payload) { 
    return Csp.update(payload).$promise.then(function(result) { 
return result.data 
    }); 
    } 
Смежные вопросы