Sailsjs:为什么* return *在以下代码中使用或不使用?

时间:2014-02-27 17:31:06

标签: javascript node.js sails.js

我不清楚以下代码中使用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);
      });
    });
  },

2 个答案:

答案 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