Javascript 完成()与返回完成()的比较
我正在阅读passport的文档,我注意到使用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
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
与否就更有意义了。