done() 与返回 done()

jen*_*fer 5 javascript express passport.js

我正在阅读护照文档,我注意到有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);
    });
  }
));
Run Code Online (Sandbox Code Playgroud)

Tex*_*Tex 4

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

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

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

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);
    });
  }
));
Run Code Online (Sandbox Code Playgroud)

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

done()没有return

const done = console.log

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

assessThreatLevel('all good')
Run Code Online (Sandbox Code Playgroud)

`返回完成():

const done = console.log

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

assessThreatLevel('all good')
Run Code Online (Sandbox Code Playgroud)

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