有可能强迫路线吗?
示例:
我有这条路线 A :
notiSchema =通知模型
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);
});
这里的问题是' res.json'在更新userB之前读取行
所以我创建了另一条路线 B :
router.get('/get', middleware.isLoggedIn, function(req, res){
res.json(req.user.notifications);
});
我的 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
});
});
但有时路线" B"之前被称为" A"结束;
所以我想知道是否可以调用" B"只有在" A"一个人完全完成了。
答案 0 :(得分:2)
我重写了你的路线,将所有的变化累积到req.user.notifications
,然后在结束时保存一次(如果数组被修改)。这允许您只有一个.save()
操作,并通过将回调传递给它来知道它何时完成。
变更摘要:
.length === 0
的特殊情况,因为不需要。req.user.save()
上的回调来了解它何时完成,以便我们可以。保存完成后发送响应。.save()
添加错误处理。.findById()
以下是代码:
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);
}
});
});
如果您更改了db代码,以便从查找操作中获得一组用户,那么您可以处理以下内容:
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);
}
});
});