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.sendres.json )时, 总会返回一个好的约定。

没有使用return因为代码可能会执行asynchronous操作。 asynchronous操作“并行”或“稍后”或“只是不按顺序”运行,从而打破了您的代码序列(思考线程)。

通常的做法是提供一个函数(通常称为“callback函数”)或一个包含一堆函数的对象,这些函数可以在asynchronous操作完成时调用,而不是return