2017-01-29 15 views
0

2つのループの間の角度の約束にはいくつかの問題があります。最初のループは値の配列を通り、各値に対してPouchDB Queryを作成していくつかのデータを取得します。最後に、次のようになりJSONオブジェクトコントローラに戻りたいと思います:このオブジェクトでは牽引ループによるAngularJSの約束

{ 
    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

Thx、私は$ q.all()を試してみます...私のデータベースを照会する別の関数を作るために私のコードをカットしましたが、同じ問題があったと思います。$ q.all痛みの...時間の多くを解決します。 –