首页 > 解决方案 > 同步功能没有相应地工作

问题描述

所以,我使用的是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);
              })
       })) 
}

标签: javascriptnode.jsfunctionjwtpassport.js

解决方案


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

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


推荐阅读