我不清楚以下代码中使用return
或不的原因。请解释何时应该使用或不应该使用或要求返回响应。
update: function(req, res) {
var id = req.param('id');
User
.update(id, req.params.all())
.exec(function(err, users) {
if(err) return res.json(err, 400);
var user = users[0];
console.log('ID', user.id);
User
.findOne(user.id)
.populate('profile')
.exec(function (err, user){
if (err) return res.json(err, 400);
res.json(user, 201);
});
});
},
答案 0 :(得分:1)
return
用于相关代码,而不是else
。代码可以重写为:
update: function(req, res) {
var id = req.param('id');
User
.update(id, req.params.all())
.exec(function(err, users) {
if(err) {res.json(err, 400);}
// note the lack of "return" above, because in the case of an error
// the code below will never run
else {
var user = users[0];
console.log('ID', user.id);
User
.findOne(user.id)
.populate('profile')
.exec(function (err, user){
if (err) {res.json(err, 400);} // again, no return
else {res.json(user, 201);}
});
}
});
};
但是这需要你跟踪更多的大括号,并且可能效率较低(尽管在这些情况下v8可能会优化else
)。您还会看到在涉及回调时经常使用此约定:
function (req, res, next) {
if (!req.session.loggedInUser) {
return res.forbidden();
}
return next();
}
同样,您可以使用else
重写:
function (req, res, next) {
if (!req.session.loggedInUser) {
res.forbidden();
} else {
next();
}
}
请注意这里的一个重要区别:在else
代码较少的情况下,如果您遗漏第一个return
,您将遇到麻烦,因为您会发送res.forbidden
回复和执行next()
方法,这几乎肯定不需要。另一方面,在return
代码较少的情况下,如果您要在if/else
之后添加更多代码,则无论是什么,它都会被执行,您也不会我想要。因此,当您使用回调(例如next()
)或执行将向客户端发送完整响应的代码(例如res.send
)或<{1}}时,总是返回< res.json
)。
答案 1 :(得分:0)
return
,因为代码可能会执行异步操作。异步操作“并行”或“稍后”或“不按顺序”运行,从而破坏了代码的顺序(想想线程)。
通常的做法是提供一个函数(通常称为“回调”)或托管一系列函数的对象,这些函数可以在异步操作完成时调用,而不是return
。