Its possible to force a route ?
Example:
I have this route A:
notiSchema = notification model
router.get('/set', function(req, res){
User.findById("userId". function(err, foundUser){
foundUser.notiSchemaSent.forEach(function(notiSchema, i){
if(req.user.notifications.length === 0){
req.user.notifications.unshift(notiSchema);
req.user.save();
} else {
req.user.notifications.forEach(function(userSchema, i){
if(req.user.notifications.indexOf(notiSchema) === -1){
req.user.notifications.unshift(notiSchema);
req.user.save();
}
});
}
});
});
res.json(req.user.notifications);
});
Problem here is that the 'res.json' line is read before the userB is updated
So i created this other route B:
router.get('/get', middleware.isLoggedIn, function(req, res){
res.json(req.user.notifications);
});
My Ajax:
$.get('/set', function(data){
// I only add a "fa-spin" class here
}).then(function(){
$.get('/get', function(data){
$(data).each(function(i, item){
$('.notDrop').prepend(item);
});
// Remove the "fa-spin" class
});
});
But sometimes route "B" is called before "A" ends;
So i want to know if its possible to call the "B" route only after the "A" one gets totally finished.
I rewrote your route to accumulate all the changes into req.user.notifications
and then just save once at the end (if the array was modified). This allows you to then have only one .save()
operation and to know when it's done by passing a callback to it.
Summary of changes:
.length === 0
as that is not needed.req.user.save()
to know when it's done so we can then. send the response after the save is done..save()
..findById()
Here's the code:
router.get('/set', function(req, res){
User.findById("userId", function(err, foundUser){
if (err) {
console.log(err);
res.status(500).send("Error finding user.")
return;
}
let origLength = req.user.notifications.length;
foundUser.notiSchemaSent.forEach(function(notiSchema, i){
req.user.notifications.forEach(function(userSchema, i){
if(req.user.notifications.indexOf(notiSchema) === -1){
req.user.notifications.unshift(notiSchema);
}
});
});
if (req.user.notifications.length !== origLength) {
req.user.save(function(err) {
if (err) {
console.log(err);
res.status(500).send("Error saving user notifications.")
} else {
res.json(req.user.notifications);
}
});
} else {
res.json(req.user.notifications);
}
});
});
If you change your db code so you get an array of users from the find operation, then you can process those like this:
router.get('/set', function(req, res){
User.find({_id: {$in: arrayOfIds}}, function(err, foundUsers){
if (err) {
console.log(err);
res.status(500).send("Error finding user.")
return;
}
let origLength = req.user.notifications.length;
foundUsers.forEach(function(foundUser) {
foundUser.notiSchemaSent.forEach(function(notiSchema, i){
req.user.notifications.forEach(function(userSchema, i){
if(req.user.notifications.indexOf(notiSchema) === -1){
req.user.notifications.unshift(notiSchema);
}
});
});
});
if (req.user.notifications.length !== origLength) {
req.user.save(function(err) {
if (err) {
console.log(err);
res.status(500).send("Error saving user notifications.")
} else {
res.json(req.user.notifications);
}
});
} else {
res.json(req.user.notifications);
}
});
});