【问题标题】:synchronous function not working accordingly同步功能没有相应地工作
【发布时间】:2020-07-04 06:51:04
【问题描述】:

所以,我使用的是 passport-jwt 并遇到了这个问题。我有两个模型,一个是带有姓名、地​​址、角色……的员工,另一个是带有用户名、密码、员工(Object_Id)的员工凭证。 然后我想要的是,在我找到员工用户名和密码之后,我需要员工角色,所以我使用了employee.findbyId,但它返回一个承诺并在获得员工角色之前调用回调完成。

我想要的是它发生的原因(详细了解它)???我没有使用 async/await 所以函数是同步的。

 (passport)=>{
       let options = {};
       options.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('jwt');
       options.secretOrKey = config.SECRET;
       passport.use(new Strategy( options,(payload,done)=>{
           Employee_credential.findById(payload.data._id, (err, employee)=>{
                  if(err)  return done(err,false);
                  if(employee){ 
                var result = Employee.getById(employee.employee).populate('role').catch(err=>{throw err})
                          employee.role = result.role.role_Id;
                          return done(null, employee);
                              }
                  return done(null,false);
              })
       })) 
}

【问题讨论】:

  • 我没有使用 async/await,所以这个函数是同步的——它不能那样工作。 API 本质上是异步的,您是否使用async 函数取决于您作为程序员。
  • async/await 就是所谓的 syntactic sugar - 它使异步函数的工作变得更容易,但这并不是使函数异步的原因。

标签: javascript node.js function jwt passport.js


【解决方案1】:

这里的事情可能顺序发生,但不是同步。您的函数按照编写的顺序发生,但它不会等待您的 API 调用的结果。这就是为什么你得到的是承诺而不是员工的角色。要完成这项工作,您应该使用 async/await(我的首选方法)或返回一个 Promise 并使用 .then 设置下一个函数。

根据个人经验,并非所有 API 都能与 await 一起正常工作,具体取决于它们处理承诺的方式。在某些情况下,我不得不将其与通过return new Promise((resolve) => { //your function; resolve(employee); } 或类似的方式明确解决承诺相结合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多