对 passport serialize/deserialize 用户中回调函数的困惑

Confusion about callback function in passport serialize/deserialize user

我有一个关于 asynchronous/synchronous 的问题,当我们用 JS 编写代码时,我已经做了 google 搜索,但我仍然有点困惑。

我理解我们使用回调函数是为了保证回调函数只有在外部函数中的异步任务(比如访问数据库)完成后才执行。我了解反序列化和序列化用户的工作原理。

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

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

done(null, user.id);

});

如果我们只想要作为参数传递给 serializeUser() 的内部箭头函数仅在 serializeUser() 完成后执行。或者为什么我们需要将它作为回调函数传递而不是调用 serializeUser() 下面的箭头函数?我以为JS是同步的所以它会在serializeUser()完成后执行箭头功能?

我只在护照文档中找到了关于如何使用它的 serializeUser() 文档,但没有找到它的实现,所以我也很困惑是 serializeUser() 还是 deserializeUser()(或任何其他护照功能)是异步功能?

谢谢!

是github(https://github.com/jaredhanson/passport/blob/08f57c2e3086955f06f42d9ac7ad466d1f10019c/lib/authenticator.js)上这个函数的一个片段。

如您所见,此函数采用 fn 参数。然后它检查它是否是一个函数。如果是,它将推到 this._serializers。后来它'some magic'就可以了,我觉得现在不重要了。

正如您在 jsdoc 中看到的那样,serializeUser 目的是注册一个用于序列化用户对象的函数。因此,您传递了一些函数,该函数稍后在带有 2 个参数的代码中调用,在该特定函数级别上的标签是 userdone

他们给你留下了一些 space,你可以用自己的代码填充。你可以知道这将如何表现。他们让您有机会实现自己的逻辑。

简单示例:

function doSomeMagic(fn) {
  // I do some my staff
  const a = 5;
  const b = 10;

  // and now I let you decide what to do
  // you can implement your own logic in my function
  const result = fn(a, b);

  console.log(result);
}

doSomeMagic((a, b) => {
  return a * b;
});

doSomeMagic((a, b) => {
  return a + b;
});

//output:
// 50
// 15

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