weixin_33736832 2018-03-17 19:21 采纳率: 0%
浏览 48

快递路线

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.

  • 写回答

1条回答 默认 最新

  • weixin_33749242 2018-03-17 20:57
    关注

    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:

    1. Accumulate results in the array and only save at the end.
    2. Only save if the array was modified.
    3. Get rid of the special case for .length === 0 as that is not needed.
    4. Use a callback on req.user.save() to know when it's done so we can then. send the response after the save is done.
    5. Add error handling for .save().
    6. Add error handling for .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);
            }
        });
    });
    
    评论

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵