Sailsjs:为什么*返回*使用或不在下面的代码?
我不清楚为什么在下面的代码中使用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); }); }); },
在代码中使用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);} }); } }); };
但是这要求你跟踪更多的大括号,并可能效率较低(尽pipe在这些情况下v8可能会优化else
)。 当涉及到callback的时候,你也会经常看到这个约定:
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()
方法,而这几乎肯定不会想。 另一方面,在lessreturn
代码的情况下,如果在if/else
之后添加更多的代码,则不pipe什么 ,哪个也不需要执行。 所以,当你使用callback(如next()
)或者执行将向客户端发送完整响应的代码(如res.send
或res.json
)时, 总会返回一个好的约定。
没有使用return
因为代码可能会执行asynchronous操作。 asynchronous操作“并行”或“稍后”或“只是不按顺序”运行,从而打破了您的代码序列(思考线程)。
通常的做法是提供一个函数(通常称为“callback函数”)或一个包含一堆函数的对象,这些函数可以在asynchronous操作完成时调用,而不是return
。