【发布时间】:2018-03-17 19:21:44
【问题描述】:
可以强制路由吗?
示例:
我有这条路线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);
});
这里的问题是在 userB 更新之前读取了“res.json”行
所以我创建了这条其他路线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”结束之前被调用;
所以我想知道是否只有在“A”完全完成后才可以调用“B”路线。
【问题讨论】:
-
你不需要强制路由,这个概念也没有多大意义。您只需要适当地编写您的路线,这样您就不会在异步操作完成之前发送响应。您的
.save()操作应该有一个回调或承诺,告诉您何时完成,并且仅在完成后发送您的响应。此外,您可能需要停止使用.forEach(),这样您就可以在找到您要查找的那个时停止循环,然后在.save()完成后发送响应。 -
为了更具体地帮助您,我们必须查看真实代码,而不是伪代码,因为不清楚您在嵌套的
.forEach()循环中真正想要做什么以及为了向您展示如何为循环中的异步操作正确编码,需要您真正尝试做的事情。在 stackoverflow 上,我们对真实代码的实际解决方案比对伪代码的假设解决方案更有帮助。 -
@jfriend00 嘿,我开始使用 forEach 是因为我读到它可以帮助解决异步问题。发布更新
标签: javascript ajax mongodb express asynchronous