【发布时间】:2020-09-08 12:17:45
【问题描述】:
当我们在 JS 中编写代码时,我有一个关于异步/同步的问题,我已经进行了谷歌搜索,但我仍然有点困惑。
我知道当我们想确保回调函数只有在外部函数中的异步任务(例如访问数据库)完成后才执行时,我们使用回调函数。我了解反序列化和序列化用户的工作原理。
我很困惑,为什么当我们使用passport.js 序列化用户或反序列化用户时,我们需要这样的回调函数?
passport.serializeUser((user, done) => {
done(null, user.id);
});
如果我们想要的只是作为参数传递给serializeUser() 的内部箭头函数仅在serializeUser() 完成后执行。或者为什么我们需要将它作为回调函数传递,而不是在 serializeUser() 下方调用箭头函数?我以为 JS 是同步的,所以它会在 serializeUser() 完成后执行箭头函数?
我只在护照文档中找到了关于如何使用它的 serializeUser() 文档,但没有找到它的实现,所以我也很困惑 serializeUser() 或 deserializeUser()(或任何其他护照函数)是否是异步函数?
谢谢!
【问题讨论】:
-
serializeUser将随时运行回调函数。您需要将其作为函数传递,因为这就是serializeUser的实现方式。您不能简单地运行“下面”serializeUser的函数,因为您需要回调函数接收的参数(例如,用户)。见stackoverflow.com/q/27637609/438992。 -
可以在你承诺的下面编码它并使用 async/await
-
@DaveNewton:谢谢。我想知道这是否仍然意味着只有在 serializeUser() 完成后才调用回调函数?
-
@dandavis:谢谢。我想知道你能详细说明如何在这里使用 promise 吗?我也是关于 async/await 的使用。我想知道
serializeUser()不是异步的吗?因为我们需要使用 async/await。 -
@bubblerain 只要
serializeUser调用它,就会调用回调。它可能在其正常流程的末尾,也可能不是——您所能做的就是查看源代码以了解如何/何时使用回调。
标签: javascript node.js asynchronous passport.js synchronous