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

快递路线

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

报告相同问题?