2016-06-29 6 views
0

в этой функции nodejs, я создаю несколько записей в mongodb с использованием мангуста. счетчик подсчитывает, сколько.nodejs loop async вызывает

export function createTimeslots(req, res){ 
    var startDate = req.body.startDate; 
    var Duration = req.body.Duration; 
    var repeat = req.body.repeat; 
    var counter=0; 

    for(var i=0; i<repeat; i++){ 
    var startTime = ... calculation 
    var endTime = ...calculation 

    var ts = { 
     startTime: startTime, 
     endTime: endTime, 
    }; 

    TimeSlot.create(ts, function(err, timeslot){ 
     counter = counter+1; 
    }); 
    } 

    res.status(200).json(counter + ' timeslots created'); 

} 

проблема заключается в том, что в результате всегда создается «0 временных интервалов». Я подозреваю, что функция create async, и к тому времени, когда это будет сделано, нам больше не нужно обновлять счетчик. Итак, как я могу считать эти записи? (я знаю, что я могу использовать счетчик Петли, но я планирую сделать валидации , а в некоторых случаях, чтобы не создавать запись. Спасибо :)

ответ

3

Promises поможет здесь:

export function createTimeslots(req, res){ 
    var startDate = req.body.startDate; 
    var Duration = req.body.Duration; 
    var repeat = req.body.repeat; 
    var counter=0; 

    var promises = []; 

    for(var i=0; i<repeat; i++){ 
    var startTime = ... calculation 
    var endTime = ...calculation 

    var ts = { 
     startTime: startTime, 
     endTime: endTime, 
    }; 

    promises.push(new Promise(function(resolve) { 
     TimeSlot.create(ts, function(err, timeslot) { 
     counter = counter+1; 
     resolve(); 
     }); 
    })); 
    } 

    Promise.all(promises).then(function() { 
     res.status(200).json(counter + ' timeslots created'); 
    }); 
} 

Это будет ждать завершения всех асинхронных операций и только затем продолжить и создать сообщение возврата.

+1

вам, вероятно, тоже нужно что-то сделать, отклонив обещание по ошибке – mkoryak

+0

Замечательно. Благодаря! –

-1

счетчика устанавливается на 0 каждый раз, когда у позвонить createTimeslots, так что это модель varible

var counter=0; 
 
export function createTimeslots(req, res){ 
 
    var startDate = req.body.startDate; 
 
    var Duration = req.body.Duration; 
 
    var repeat = req.body.repeat; 
 
    
 
    for(var i=0; i<repeat; i++){ 
 
    var startTime = ... calculation 
 
    var endTime = ...calculation 
 

 
    var ts = { 
 
     startTime: startTime, 
 
     endTime: endTime, 
 
    }; 
 

 
    TimeSlot.create(ts, function(err, timeslot){ 
 
     counter = counter+1; 
 
    }); 
 
    } 
 
    
 
    res.status(200).json(counter + ' timeslots created'); 
 

 
}

+0

счетчик увеличивается в функции асинхронной, который, возможно, не выполненных к тому времени 'res.status' линия называется. в лучшем случае это состояние гонки, в худшем случае это не будет работать. – mkoryak

+0

Это не решит проблему, если обратный вызов выполняется асинхронно. – Timo

+0

счетчик событий увеличивается в асинхронной функции, используйте обещание @mkoryak, поскольку TimoSta сделал –

-1

Переместите счетчик вне тела обратного вызова async, который вы передаете методу создания TimeSlot.

export function createTimeslots(req, res){ 
    var startDate = req.body.startDate; 
    var Duration = req.body.Duration; 
    var repeat = req.body.repeat; 
    var counter=0; 


    for(var i=0; i<repeat; i++){ 
    var startTime = ... calculation 
    var endTime = ...calculation 

    var ts = { 
     startTime: startTime, 
     endTime: endTime, 
    }; 

    counter = counter+1; 

    TimeSlot.create(ts, function(err, timeslot){ 
     // do stuff with counter 

    }); 
    } 

    res.status(200).json(counter + ' timeslots created'); 

}

+1

за исключением случаев, когда создание потерпело неудачу, это – mkoryak