寻找一种更有效的方法在mongoose-q中做很多查询

我正在使用mongoose-q(对于node.jsstream行的mongoose mongodb ORM的承诺封装)。

但是,我倒下了,也许这些嵌套的承诺没有比callback更好。

有没有更好的方法来做这些查询?

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

为什么你重现了callback典型的金字塔?

我会build议重写代码如下。 只有一个error handling程序(失败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); }); 

关于传播的说明:

如果你有一个数组的承诺,你可以使用传播作为替代。 传播函数将价值“传播”到执行处理程序的参数上。 拒绝处理程序将在失败的第一个标志处被调用。 也就是说,无论哪个收到的承诺失败,都会先被拒绝处理程序处理。

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

这是一个使用“then”的替代方法:

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