我正在使用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);
});
答案 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);
});