关于护照序列化/反序列化用户中的回调函数的困惑

问题描述 投票:0回答:1

当我们用JS编写代码并且完成Google搜索但我还是有点困惑时,我对异步/同步有疑问。

我知道我们要确保仅在外部函数中的异步任务(例如访问数据库)完成后才执行回调函数,所以我们使用回调函数。我了解反序列化和序列化用户的工作方式。

我很困惑,为什么当我们使用passport.js序列化用户或反序列化用户时,我们需要像这样的回调函数?

passport.serializeUser((user, done) => {

done(null, user.id);

});

如果只需要将内部箭头函数作为参数传递给serializeUser(),则仅在serializeUser()完成后才能执行。还是为什么我们需要将其作为回调函数传递,而不是在serializeUser()下面调用该箭头函数?我以为JS是同步的,所以无论如何serializeUser()完成后它将执行箭头功能?

我只在护照文档中找到有关如何使用它的serializeUser()文档,但没有找到实现方法,因此,我也困惑serializeUser()deserializeUser()(或任何其他护照功能)是异步功能吗?

谢谢!

javascript node.js asynchronous passport.js synchronous
1个回答
0
投票
它是此功能在github(https://github.com/jaredhanson/passport/blob/08f57c2e3086955f06f42d9ac7ad466d1f10019c/lib/authenticator.js)上的片段。

如您所见,该函数带有fn参数。然后,它检查它是否是一个函数。如果是,它将其推到this._serializers。后来它对它做了“魔术”,我认为现在不重要了。

您可以在jsdoc中阅读,serializeUser的用途是注册一个用于序列化用户对象的函数。因此,您传递了一些函数,该函数稍后将在带有2个参数的代码中调用,该参数在该特定函数级别上的标签为userdone

他们给您留了一些空间,您可以用自己的代码填充这些空间。您可以说出它的行为方式。他们为您提供了实施自己的逻辑的机会。

简单示例:

function doSomeMagic(fn) { // I do some my staff const a = 5; const b = 10; const result = fn(a, b); console.log(result); } doSomeMagic((a, b) => { return a * b; }); doSomeMagic((a, b) => { return a + b; }); //output: // 50 // 15

这正是他们所做的。您可以使用我的函数,我给您两个参数,随您便。您可以随意乘,加,减。我不必编写单独的函数来进行数学运算,我可以编写一个函数,将值作为参数传递,然后让您决定要执行的操作。这并不意味着我的代码将以异步方式运行。

© www.soinside.com 2019 - 2024. All rights reserved.