寻找一种在mongoose-q中执行许多查询的更有效方法

时间:2014-08-16 19:42:54

标签: node.js mongoose mongoose-q

我正在使用mongoose-q(用于node.js的流行mongoose mongodb ORM的承诺包装器)。

但是,我觉得这些嵌套的承诺可能并不比回调好多了。

有更好的方法来进行这些查询吗?

User.findById(toFollowId)
    .execQ()
    .then(function(user){
        if (!user) return res.send(404);

        user.followers.addToSet(me);
        me.following.addToSet(user);

        me.saveQ()
            .then(function(me){
                user.saveQ()
                    .then(function(user){
                        getFollowerStats([me, user], function(err, data){
                            if ( err ) return res.json(400, err);

                            res.json(data);
                        });
                }).fail(function(err){
                    res.json(400, err);
                });
            })
            .fail(function(err){
                res.json(400, err);
            });
    }).fail(function(err){
        next(err);
    });

1 个答案:

答案 0 :(得分:1)

为什么要重现典型的回调金字塔?

我建议重写代码如下。只有一个错误处理程序(fail fn),检查它是否符合您的需求。请注意,您必须包含q库。

q = require('q');


User.findById(toFollowId)
    .execQ()
    .then(function(user){
        if (!user) return res.send(404);

        user.followers.addToSet(me);
        me.following.addToSet(user);

        return q.all([me.saveQ(), user.saveQ()]);
    })
    .spread(function(me, user){
        getFollowerStats([me, user], function(err, data){
            if ( err ) return res.json(400, err);

            res.json(data);
        });
    })
    .fail(function(err){
        next(err);
    });

关于传播的说明:

  

如果您对数组有承诺,可以使用spread作为   替换当时。扩散函数“扩展”值   履行处理程序的参数。拒绝处理程序将   在失败的第一个迹象时被召唤。也就是说,无论哪个   收到的承诺失败首先由拒绝处理程序处理。

有关完整说明,请参阅doc(http://documentup.com/kriskowal/q/)。

以下是使用"然后"

的替代方案
User.findById(toFollowId)
    .execQ()
    .then(function(user){
        if (!user) return res.send(404);

        user.followers.addToSet(me);
        me.following.addToSet(user);

        return q.all([me.saveQ(), user.saveQ()]);
    })
    .then(function(resolvedArray){
        var me = resolvedArray[0],
            user = resolvedArray[1];

        getFollowerStats([me, user], function(err, data){
            if ( err ) return res.json(400, err);

            res.json(data);
        });
    })
    .fail(function(err){
        next(err);
    });