2017-01-29 8 views
0

두 개의 루프 사이의 각도 약속에 대한 문제가 있습니다 ... 첫 번째 루프는 값 배열을 통과하고 각 값에 대해 PouchDB 쿼리를 만들어 일부 데이터를 검색합니다. 마지막으로, 같을 것이다 JSON 개체 컨트롤러로 돌아 싶습니다 : 기본적으로 "항목"이 개체에서견인 루프를 통한 각도 보장

{ 
    items: [ 
     { 
      "attribute": "some value" 
     }, 
     { 
      "attribute": "some other value" 
     }, 
     ... 
    ], 
    "a_total": "some_total", 
    "another_total": "some_other_total" 
} 

보이는 함수에 코드를 넣어 같은 :

var _stockByAreas = function(){ 
     var deferred = $q.defer(); 

     var data = {}; // Final datas to return to controller 


     // Get first array to loop into 
     var storageAreas = storageAreaService.storageAreaList(); 

     var areas = []; // All of area 

     // Walk across array 
     angular.forEach(storageAreas, function(zone){ 
      var area = {}; // First object to return 

      area.id = zone.id; 
      area.libelle = zone.libelle; 

      // Then make a PouchDB query to get all datas that involved 
      MyKitchenDB.query(function(doc, emit){ 
       emit(doc.storage); 
      }, { key: area.id, include_docs: true }).then(function (result) { 

       area.sRef = "tabsController.addTo({id: '" + area.id + "'})"; 
       area.nbProduct = 0; 
       area.totalQuantity = 0; 
       area.totalValue = 0; 

       // ... process result 
       if(result.rows.length > 0){ 
        // Some results, so... let's go 
        area.sRef = "tabsController.outFrom({id: '" + area.id + "'})"; 

        var rows = result.rows; 

        // Counter initialization 
        var total = 0; 
        var value = 0; 

        angular.forEach(rows, function(row){ 
         total++; 

         var stocks = row.doc.stock; 
         angular.forEach(stocks, function(stock){ 
          var nearOutOfDate = 0; 
          var nearStockLimit = 0; 
          quantity += stock.quantity; 

          value += stock.quantity * stock.price; 

          // Evalue la date de péremption 
          var peremptionDate = moment(stock.until); 
          var currentDate = moment(); 
          if(currentDate.diff(peremptionDate, 'days') <= 1){ 
           nearOutDate += 1; 
          } 

         }); 
         area.nbProduct = total; 
         area.qteTotale = quantity; 
         area.valeur = value; 

         if(quantite == 1){ 
          nearLimitOfStock += 1; 
         } 
         areas.push(area); // Add result to main array 
        }); 
       } 
      }).catch(function (err) { 
       // Traite les erreurs éventuelles sur la requête 
      }); 

      /** 
      * Hey Buddy... what i have to do here ? 
      **/ 
      data.items = areas; 
      data.nearLimitOfStock = nearLimitOfStock; 
      data.nearOutOfDate = nearOutOfDate; 
     }); 

     deferred.resolve(data); 

     return deferred.promise; 
    } 

...하지만, 콘솔은 ... 내가 정말 약속을 실행하는 방법을 이해하지 않습니다 생각

... "영역"가 정의, 너무 다른 값으로되지 않도록 반환

누가 내 사건에서 기대하는 결과를 얻을 수없는 이유를 설명하기 위해 애비가 있습니까? Thx

답변

2

코드가 너무 길어서 접근 방식을 알려줍니다.
모든 검색어가 완료되었는지 확인하려면 $q.all()을 사용하십시오. 그리고 각 쿼리에 대한 데이터가 도착할 때마다 deferred.resolve(data)을 사용하십시오.

var _stockByAreas = function() { 

    var query = function(zone) { 
     var queryDef = $q.defer(); 

     // timeout is for query and response simulations 

     setTimeout(function() { 
      // ... 
      queryDef.resolve({data: 'MeTe-30'}); 
     }, 1000); 
     return queryDef.promise; 
    } 

    var promises = []; 

    angular.forEach(storageAreas, function(zone) { 
     // ... 
     promises.push(query(zone)); 
    }); 

    return $q.all(promises); 
} 

_stockByAreas().then(function(res) { 
    // res[0] resolved data by query function for storageAreas[0] 
    // res[1] resolved data by query function for storageAreas[1] 
    // ... 
}); 
+0

들으, 난 이미 내 데이터베이스를 쿼리하는 다른 기능을 만들기 위해 내 코드를 잘라 것 ... $ q.all()를 시도하지만 같은 문제가 있었다거야, 나는 $ q.all 생각 고통의 많은 시간을 해결할 것입니다. –