done () vs return done () - PullRequest
       7

done () vs return done ()

2 голосов
/ 06 января 2020

Я читал документы для паспорта и заметил, что с 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);
    });
  }
));

1 Ответ

1 голос
/ 07 января 2020

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);
    });
  }
));

Здесь Я добавил два исполняемых фрагмента, чтобы проиллюстрировать разницу между 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')

`возврат завершен ():

const done = console.log

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

assessThreatLevel('all good')

В качестве отступления я в большинстве случаев использовал return done() в целях обеспечения согласованности. Насколько я знаю, нет недостатка в его использовании. Это может помочь вам избежать ошибок, а оператор return служит гарантией и хорошим визуальным напоминанием о том, что функция завершит работу сразу же после оценки этого оператора.

...