2015-06-24 3 views
1
function ParseOrderSchema(CartItems , callback) 
{ 
    var lookup = 0; 
    var subOrderList = new Array(); 

    for(var i=0;i<CartItems.length;i++) 
    { 
     Meal.findOne({ _id: CartItems[i].id }).lean().exec(function (err, meal) { 

      console.log(CartItems[i]); 
      //meal.mealQTY = CartItems[i].qty; 
      var s = new subOrder({ meals: meal, deliveryDate: getMomentDate(0) }); 
      subOrderList.push(s); 

      if (++lookup == CartItems.length) callback(subOrderList); 
     }); 
    } 
} 

В CartItem[i].id он отлично работает и умеет нормально работать. Но он не работает на этой линии meal.mealQTY = CartItems[i].qty;MongoDB findOne error in for loop

Не может распознать CartItems[i] внутри метода findOne().

+0

Можете ли вы показать нам 'Meal' схемы? – chridam

+0

Это простая схема с названием и количеством еды –

+0

И есть ли способ решить это? –

ответ

2

Поскольку findOne является асинхронной, i всегда будет CartItems.length внутри обратного вызова, как цикл for выполняется до завершения, прежде чем любой из findOne обратных вызовов происходит.

Вы можете исправить это итерация CartItems с использованием forEach вместо так, чтобы элемент каждой итерации захватывается локального параметра функции:

function ParseOrderSchema(CartItems, callback) { 
    var lookup = 0; 
    var subOrderList = new Array(); 

    CartItems.forEach(function(cartItem) { 
     Meal.findOne({ _id: cartItem.id }).lean().exec(function (err, meal) { 

      console.log(cartItem); 
      meal.mealQTY = cartItem.qty; 
      var s = new subOrder({ meals: meal, deliveryDate: getMomentDate(0) }); 
      subOrderList.push(s); 

      if (++lookup == CartItems.length) callback(subOrderList); 
     }); 
    }); 
} 
+0

Это работает Спасибо. Переход от программы синхронизации. для Async кажется более сложным, чем предполагалось ранее :) –