javascript - 同步功能没有相应地工作
问题描述
所以,我使用的是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);
})
}))
}
解决方案
事情可能在这里按顺序发生,但不是同步发生。您的函数按照编写的顺序发生,但它不会等待您的 API 调用的结果。这就是为什么你得到的是承诺而不是员工的角色。要完成这项工作,您应该使用 async/await (我的首选方法)或返回一个承诺并使用.then
.
根据个人经验,并非所有 API 都能正常工作,await
具体取决于它们处理 Promise 的方式。在某些情况下,我不得不将它与通过return new Promise((resolve) => { //your function; resolve(employee); }
或类似的方式明确解决承诺相结合。
推荐阅读
- java - 如何使用 jgrapht 创建子图
- javascript - 如何从 javascript 文件 insize 脚本标签访问变量?
- javascript - GraphQL - “[用户]”类型的字段“x”必须有一个子字段选择。你的意思是“x{ ... }
- sql - SQLPlus 透视日期列
- xml - XSD 将字符串长度限制为两个值之一?
- c# - 获取当前类的变量名
- git - 我无法从存储库历史记录中删除 Git 大文件
- javascript - 在 React 中上传图像时出现内部服务器错误
- c++ - 在 C++ 中处理复合文字的跨平台方法是什么?
- php - PHP试图从数组中计算变量总数