当我们用JS编写代码并且完成Google搜索但我还是有点困惑时,我对异步/同步有疑问。
我知道我们要确保仅在外部函数中的异步任务(例如访问数据库)完成后才执行回调函数,所以我们使用回调函数。我了解反序列化和序列化用户的工作方式。
我很困惑,为什么当我们使用passport.js
序列化用户或反序列化用户时,我们需要像这样的回调函数?
passport.serializeUser((user, done) => {
done(null, user.id);
});
如果只需要将内部箭头函数作为参数传递给serializeUser()
,则仅在serializeUser()
完成后才能执行。还是为什么我们需要将其作为回调函数传递,而不是在serializeUser()
下面调用该箭头函数?我以为JS是同步的,所以无论如何serializeUser()
完成后它将执行箭头功能?
我只在护照文档中找到有关如何使用它的serializeUser()
文档,但没有找到实现方法,因此,我也困惑serializeUser()
或deserializeUser()
(或任何其他护照功能)是异步功能吗?
谢谢!
如您所见,该函数带有fn
参数。然后,它检查它是否是一个函数。如果是,它将其推到this._serializers
。后来它对它做了“魔术”,我认为现在不重要了。
您可以在jsdoc中阅读,serializeUser
的用途是注册一个用于序列化用户对象的函数。因此,您传递了一些函数,该函数稍后将在带有2个参数的代码中调用,该参数在该特定函数级别上的标签为user
和done
。
他们给您留了一些空间,您可以用自己的代码填充这些空间。您可以说出它的行为方式。他们为您提供了实施自己的逻辑的机会。
简单示例:
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
这正是他们所做的。您可以使用我的函数,我给您两个参数,随您便。您可以随意乘,加,减。我不必编写单独的函数来进行数学运算,我可以编写一个函数,将值作为参数传递,然后让您决定要执行的操作。这并不意味着我的代码将以异步方式运行。