Javascript 完成()与返回完成()的比较

Javascript 完成()与返回完成()的比较,javascript,express,passport.js,Javascript,Express,Passport.js,我正在阅读passport的文档,我注意到使用serialize()和deserialize()done()调用时没有返回out 但是,当使用passport.use()设置新策略时,将使用回调函数中的return done() 这是需要理解的还是仅仅从文档中复制 从文档中: var passport = require('passport') , LocalStrategy = require('passport-local').Strategy; passport.use(new L

我正在阅读passport的文档,我注意到使用
serialize()
deserialize()
done()
调用时没有返回out

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

这是需要理解的还是仅仅从文档中复制

从文档中:

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()之后立即退出第一次调用
,以确保未评估以下任何说明:

passport.use(新基本策略)(
函数(用户名、密码、完成){
findOne({username:username},函数(err,User){
if(err){返回完成(err);}
如果(!user){返回完成(null,false);}
如果(!user.validPassword(password)){返回完成(null,false);}
//下面一行是成功案例。我们不想执行它
//如果出现错误,则为falsy用户或没有有效密码的用户
//密码。如果我们从前几行中删除了返回关键字
//对于代码,每次执行此操作时都会触发成功案例
//函数被调用
返回完成(空,用户);
});
}
));
在这里,我添加了两个可执行代码片段来说明
done()
和'return done()之间的区别。这些片段在其他方面是相同的

done()
不带
返回
const done=console.log
const assessThreatLevel=威胁级别=>{
如果(threatLevel===‘一切正常’)完成(‘放松:’)
完成(“发射导弹!”)
}

assessThreatLevel('all good')
serialize/deserialize的返回值被丢弃,因此您不需要返回任何内容
done()
也不返回任何内容。请注意,您没有返回done(),而是返回调用done()@DanPantry的结果。
return
语句立即结束函数执行这一事实通常很重要,无论返回的值是否有趣和/或是否会被调用方使用。@Dan。。。在文档中,他们正在使用
passport.use()中的
return done()
。你是说不需要返回语句吗?@tex。。。你是说在我上面发布的示例中,他们使用的是return来进行流控制,而不是b.c.它实际上返回任何东西吗?似乎这就是创建if/else语句的目的。我想这就是你喜欢的风格。同样需要注意的是,如果
done
实际上是一个承诺,那么返回
done
与否就更有意义了。