ここに問題があります。私は予約作成を処理するREST APIを持っていますが、他の予約との衝突があるかどうかをmongo内の予約を保存する前に確認します。Forループ内のNodeJSコールバックとMongooseコールバック
exports.create = function(req, res) {
var new_type = new Model(req.body);
var newBooking = new_type._doc;
//check if the new booking clashes with existing bookings
validateBooking.bookingClash(newBooking, function(clash){
if(clash == null) // no clashes, therefore save new booking
{
new_type.save(function(err, type) {
if (err)
{
res.send(err); //error saving
}
else{
res.json(type); //return saved new booking
}
});
}
else //clash with booking
{
//respond with "clashDate"
}
});
};
ここでは、同じ日に予約との衝突があるかどうかを確認するための検証機能を持っている:すべての、
exports.bookingClash = function (booking, clash) {
//find the bookings for the same court on the same day
var courtId = (booking.courtId).toString();
Model.find({courtId: courtId, date: booking.date}, function(err, bookings) {
if(err == null && bookings == null)
{
//no bookings found so no clashes
clash(null);
}
else //bookings found
{
//for each booking found, check if the booking start hour falls between other booking hours
for(var i = 0; i<bookings.length ; i++)
{
//here is where I check if the new booking clashes with bookings that are already in the DB
{
//the new booking clashes
//return booking date of the clash
clash(clashDate); //return the clashDate in order to tell the front-end
return;
}
}
//if no clashes with bookings, return null
clash(null);
}
});
};
だからこれは1つの新しい予約で動作します。しかし、今では再帰的な予約(毎週の予約)を処理できるようにしたいと考えています。私は "作成"機能を作り直して、for loop
の中でvalidateBooking.bookingClash
関数を呼び出します。私はこれを実行すると
残念ながら、それは完全にbookingClash関数を呼び出しますが、それはデータベースの検索を行うラインに到達したとき:
Model.find({courtId: courtId, date: booking.date}, function(err, bookings)
それは、コールバックのため、応答を処理する前に待機しません。 "クラッシュ"、私は++を作り続ける。
私はそれを動作させ、コールバックを待つことができますか?
var array = req.body;
var clashes = [];
for(var i = 0; i<array.length;i++)
{
validateBooking.bookingClash(array[i], function(clash)
{
if(clash)
{
clashes.push(clash);
}
else{
console.log("no clash");
}
}
}