2015-03-20 12 views
6

Tôi đang tạo một dịch vụ trong buồm js. Tôi muốn cập nhật giá trị của totalCount trước khi trả lại. Nhưng vấn đề là khi sự trở lại là trong callback của async.series tôi nhận được một undefined khi tôi gọi nó. Làm thế nào tôi nên làm điều này?Sails JS: Cách trả về một giá trị từ một dịch vụ

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 được bạn sử dụng 'async.each' cho một tổng kết đồng bộ? – Bergi

+0

Vì kết quả tìm kiếm là một mảng. Nó sẽ trả về hơn 1 thể hiện sẽ phù hợp với tiêu chí của tôi và tôi thêm tất cả những cái đó là lý do tại sao tôi sử dụng async mỗi –

+0

Có, 'inventory_items' là một mảng. Nhưng bạn có thể lặp lại điều đó với một vòng lặp 'for' đơn giản, không cần cho 'async'? – Bergi

Trả lời

7

Tôi không hoàn toàn chắc chắn những gì bạn đang cố gắng làm. Nhưng bạn có thể muốn vượt qua totalCount trong một cuộc gọi lại như thế này:

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); 
     }); 
} 

Nếu có lỗi, nó sẽ gọi lại với lỗi là tham số đầu tiên, do đó hãy kiểm tra lại. Nếu tham số đầu tiên là null, thì tham số thứ hai sẽ là độ dài mảng của bạn.

Nếu bạn muốn trả lại tất cả các sản phẩm và không chỉ là chiều dài (như tên của hàm ngụ ý), sau đó nó rất giống:

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); 
     }); 
} 

Bạn muốn sử dụng nó như thế này cho trường hợp đầu tiên:

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

... hay này đối với trường hợp thứ hai:

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

Cảm ơn rất nhiều! Điều này làm việc. –

+0

Đó là cách duy nhất? Không có cách nào để có được kết quả "ra khỏi hộp"? Không thể tin là không có. –

+0

@patryk Ý của bạn là "ra khỏi hộp"? –

Các vấn đề liên quan