我有一系列承诺,如下所示:
Ξ Λ R O N - New MV!! (via Twitter)
我的问题是关于第module.exports.deleteCommunityFollower = function deleteCommunityFollower(req, res){
var communityId = req.params.userId;
var followerId = req.session.passport.user.userId;
var community = new user_model.User(communityId);
community.getFollower(followerId)
.then(function(data) {
if(data.length === 0) {
res.sendStatus(404); //no follower found, interrupt execution
} else {
return community.removeFollower(data[0]); //returns a promise
}
})
.then(function() {
res.sendStatus(201); //follower removed, success
})
.fail(function(error) {
errorHelper.diagnosticsUploader(error, community);
res.sendStatus(500);
});
}
行。这是否是打断承诺链执行的正确而优雅的方式?背景是,有时当链接承诺时,我发现了像这样的场景,你需要停止链的执行,原因是不是错误。我知道我可以在res.sendStatus(404)
上抛出一个人为的错误,但这对我来说看起来不太优雅。
在上面的代码中,当data.length === 0
为真时,我只返回一个http响应并且不向promise解析器返回任何值,从而有效地防止链执行继续。但是,我想验证这是否是推荐的做法。留下一个挂在中途的承诺看起来像是它可能成为未来的麻烦之源(内存泄漏?)
答案 0 :(得分:2)
由于您使用的是现代节点,因此我将使用Q.async
编写它:
const deleteFollower = Q.async(function*(communityId, followerId){
const community = new user_model.User(communityId);
let followers = yield community.getFollower(followerId);
if(followers.length) === 0; return false;
yield community.removeFollower(follower[0]);
return true;
});
读取像同步功能,完全平坦,好吧?
我省略了从req / res中提取内容的代码,因为这会使代码更难以测试,并且它应该可能是分开的。我称之为:
function handler(req, res){
var communityId = req.params.userId;
var followerId = req.session.passport.user.userId;
deleteFollower(communityId, followerId).then(val => {
if(val) res.sendStatus(201);
else res.sendStatus(404);
}).fail(err => {
res.sendStatus(500);
errorHelper.diagnosticsUploader(err);
});
}
(注意,我个人更倾向于使用bluebird库来提高性能,我会使用Promise.coroutine
)。