强制路线在快递

时间:2018-03-17 19:21:45

标签: javascript ajax mongodb express asynchronous

有可能强迫路线吗?

示例:

我有这条路线 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"一个人完全完成了。

1 个答案:

答案 0 :(得分:2)

我重写了你的路线,将所有的变化累积到req.user.notifications,然后在结束时保存一次(如果数组被修改)。这允许您只有一个.save()操作,并通过将回调传递给它来知道它何时完成。

变更摘要:

  1. 累积数组中的结果,最后只保存。
  2. 仅在修改阵列时保存。
  3. 摆脱.length === 0的特殊情况,因为不需要。
  4. 使用req.user.save()上的回调来了解它何时完成,以便我们可以。保存完成后发送响应。
  5. .save()添加错误处理。
  6. .findById()
  7. 添加错误处理

    以下是代码:

    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);
            }
        });
    });