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 nginx中的CORS策略应该如何配置
  • ¥30 信号与系统实验:采样定理分析
  • ¥100 我想找人帮我写Python 的股票分析代码,有意请加mathtao
  • ¥20 Vite 打包的 Vue3 组件库,图标无法显示
  • ¥15 php 同步电商平台多个店铺增量订单和订单状态
  • ¥15 关于logstash转发日志时发生的部分内容丢失问题
  • ¥17 pro*C预编译“闪回查询”报错SCN不能识别
  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题