完成()与 return 完成()

done() vs return done()

我正在阅读护照文档,我注意到使用 serialize()deserialize() done() 被调用而没有被返回。

但是,当在回调函数中使用 passport.use() 设置新策略时,会使用 return done()

这是需要理解的东西还是只是从文档中复制的东西?

http://www.passportjs.org/docs/

来自文档:

var passport = require('passport')
  , LocalStrategy = require('passport-local').Strategy;

passport.use(new LocalStrategy(
  function(username, password, done) {
    User.findOne({ username: username }, function (err, user) {
      if (err) { return done(err); }
      if (!user) {
        return done(null, false, { message: 'Incorrect username.' });
      }
      if (!user.validPassword(password)) {
        return done(null, false, { message: 'Incorrect password.' });
      }
      return done(null, user);
    });
  }
));

return done() 将导致函数立即停止执行。这意味着函数内该行之后的任何其他代码行都将被忽略并且不会被评估。

done()前面没有return,但是不会导致函数停止执行。这意味着将计算函数内该行之后的任何其他代码行。

如果您看一下这个 passport.use() 示例(来自 Passport 文档),您会看到在前三个 return done() 语句之后有可访问的代码,并且您需要函数第一次调用 done() 时立即退出,以确保评估以下指令中的 none:

passport.use(new BasicStrategy(
  function(username, password, done) {
    User.findOne({ username: username }, function (err, user) {
      if (err) { return done(err); } 
      if (!user) { return done(null, false); }
      if (!user.validPassword(password)) { return done(null, false); }
      // The following line is the success case. We do not want to execute it
      // if there was an error, a falsy user or a user without a valid 
      // password. If we removed the return keywords from the previous lines
      // of code, the success case would be triggered every time this
      // function was called
      return done(null, user);
    });
  }
));

这里我添加了两个可执行片段来说明 done() 和 `return done() 之间的区别。这些片段在其他方面是相同的。

done() 没有 return

const done = console.log

const assessThreatLevel = threatLevel => {
  if (threatLevel === 'all good') done('relax :)')
  done('launch the missiles!')
}

assessThreatLevel('all good')

`return 完成():

const done = console.log

const assessThreatLevel = threatLevel => {
  if (threatLevel === 'all good') return done('relax :)')
  done('launch the missiles!')
}

assessThreatLevel('all good')

顺便说一句,为了保持一致性,我在大多数情况下都使用 return done()。据我所知,使用它没有任何缺点。它可以帮助您避免错误,return 语句作为保证和良好的视觉提醒,函数将在对该语句求值后立即退出。