gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:03:09 25 4
gpt4 key购买 nike

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

但是,我觉得这些嵌套的 Promise 并不比回调好多少。

是否有更好的方法来执行这些查询?

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

最佳答案

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

我建议按如下方式重写代码。只有一个错误处理程序(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);
});

关于点差的说明:

If you have a promise for an array, you can use spread as a replacement for then. The spread function “spreads” the values over the arguments of the fulfillment handler. The rejection handler will get called at the first sign of failure. That is, whichever of the received promises fails first gets handled by the rejection handler.

请参阅文档 ( 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);
});

关于node.js - 寻找一种更有效的方法在 mongoose-q 中执行许多查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25343308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com