2015-03-20 19 views
6

Sto creando un servizio in vele js. Voglio aggiornare il valore di totalCount prima di restituirlo. Ma il problema è quando il ritorno è nella callback di async.series. Sto diventando indefinito quando lo sto invocando. Come dovrei farlo?Sails JS: come restituire un valore da un servizio

var totalCount = 0; 

    async.series([ 
     function getProducts(cb_series){ 
      Inventory.find({sku_id : sku_id, bay_id : bay_id}) 
       .then(function(inventory_items){ 

        async.each(inventory_items, function(item, cb_each){ 
         totalCount = totalCount + item.physical_count; 
         cb_each(); 
        }, function(err){ 
         if(err) 
          console.log(err); 

         cb_series(); 
        });    
       }); 
     } 
    ], function returnResult(err, cb){ 
     if(err) 
      console.log(err); 

     return totalCount; 
    }); 
+0

WTH stai usando 'async.each' per una sommatoria sincrono? – Bergi

+0

Perché il risultato di una ricerca è un array. Restituirà più di 1 istanza che soddisferà i miei criteri e aggiungerò tutti quelli per cui sto usando async ogni –

+0

Sì, 'inventory_items' è una matrice. Ma puoi ricollegarlo con un semplice ciclo 'for', non c'è bisogno di' async'? – Bergi

risposta

7

Non sono completamente sicuro di quello che stai cercando di fare. Ma probabilmente si desidera passare totalCount in un callback come questo:

function getProducts(callback){ 
    Inventory.find({sku_id : sku_id, bay_id : bay_id}).then(
     function(inventory_items){ 
      callback(null, inventory_items.length) 
     }, function(err){ 
      console.log(err); 
      callback(err); 
     }); 
} 

Se c'è un errore, richiamerà con l'errore come è primo parametro, in modo da fare un controllo nulla su questo. Se il primo parametro è null, il secondo parametro sarà la lunghezza dell'array.

Se si preferisce restituire tutti i prodotti e non solo la lunghezza (come il nome della funzione implica), allora è molto simile:

function getProducts(callback){ 
    Inventory.find({sku_id : sku_id, bay_id : bay_id}).then(
     function(inventory_items){ 
      callback(null, inventory_items) 
     }, function(err){ 
      console.log(err); 
      callback(err); 
     }); 
} 

usereste in questo modo per la primo caso:

getProducts(function(err, productCount) { 
    if(err) { 
     console.log(err); 
     return err; 
    } else { 
     var totalCount = productCount; 
    } 
    //etc etc... 
} 

... o questo per il secondo caso:

getProducts(function(err,products) { 
    if(err) { 
     console.log(err); 
     return err; 
    } else { 
     var productArray = products; 
    } 
    //etc etc... 
} 
+0

Grazie mille! Questo ha funzionato. –

+0

È l'unico modo? Non c'è modo di ottenere il risultato "out of the box"? Non posso credere che non ci sia. –

+0

@patryk Cosa intendi "out of the box"? –

Problemi correlati