javascript - 如何在 Node.js 中使用“async/await”和“promises”进行同步执行?
问题描述
作为一个整体,我对 Web 开发相当陌生,所以我不太了解 Promise 和 async/await。我正在尝试将职位发布网站构建为一个项目,但由于无法使特定的代码按我想要的方式运行而被卡住了。
在以下代码段中,发布特定工作要求的招聘人员希望查看与工作要求相关的申请人的技能。因此,代码首先会从 mongodb 集合中获取工作详细信息和相关申请人的详细信息。然后它会尝试先存储申请人所需的技能,然后将申请人的所有技能存储在技能数组中。只有在将上述所有数据存储在技能[]中之后,代码才应该以最后一个 json 响应。但它的行为不像我想要的那样,它在存储完成之前做出响应。有人可以指导我如何使其“同步”吗?
注意:我删除了所有错误处理以使代码段更短。此外,申请人在全部 5 项技能中具有 2 项所需技能。
router.post('/recruiter/viewApplicant', passport.authenticate('jwt', {session: false}), (req, res, next) => {
if(req.user.accountType === "Recruiter") {
skills = [];
Job.getJobByID((req.body.jobID),(err, job) => {
User.getUserByEmail(req.body.email,(err, user) => {
let i =0;
job.requiredSkills.requirements.forEach(reqSkill => {
user.classData.forEach(classDetail => {
if(classDetail.classID === reqSkill.class.replace(/ /g, '-')) {
ClassData.getClassByclassID(classDetail.classID,(err, classInfo) => {
skills.push({
type: 'req',
imgURL: classInfo.imgURL,
skill: classDetail
})
console.log('req: '+i)
i++
})
}
})
})
let k=0
user.classData.forEach(classDetail => {
ClassData.getClassByclassID(classDetail.classID,(err, classInfo) => {
skills.push({
type: 'all',
imgURL: classInfo.imgURL,
skill: classDetail
})
console.log('all: '+k)
k++
})
})
})
console.log("Completed");
res.json({success: true, msg: "Successful", data: skills});
})
}
});
预期结果:
req: 0
req: 1
all: 0
all: 1
all: 2
all: 3
all: 4
Completed
实际结果:
Completed
req: 0
req: 1
all: 0
all: 1
all: 2
all: 3
all: 4
解决方案
要获取您必须工作的代码,res.json()
请按如下方式移动调用
user.classData.forEach(classDetail => {
ClassData.getClassByclassID(classDetail.classID,(err, classInfo) => {
skills.push({
type: 'all',
imgURL: classInfo.imgURL,
skill: classDetail
})
console.log('all: '+k);
k++;
})
})
res.json({success: true, msg: "Successful", data: skills});
它在你放置的地方不起作用,因为你的调用会.getJobById()
立即返回。当它完成你想要的工作时,你知道,因为它调用了它的回调函数。.getUserByEmail()
嵌套调用也是如此。
async/await 和 Promise 是组织 Javascript 回调的方法,因此它们看起来不是嵌套的。它们使代码更易于阅读。但是回调仍然是嵌套和异步的。准确解释如何将代码转换为使用 Promises 和 async/await 超出了 SO 答案的范围。简而言之,你应该承诺你的异步函数,然后你可以await
得到它们的结果。绝对值得您花一两天时间来熟悉这种 Javascript 编码方式。
专业提示:如果您使用调试器单步执行此类代码,请经常使用 Step Into。
推荐阅读
- python - csv,IndexError:列表索引超出范围
- mongodb - 如何根据条件选择进行查找?
- image - 我应该调整掩码 RCNN 的图像大小吗?
- java - 发送到 scheduleAtFixedRate 时线程名称不匹配
- java - 如何自动创建多租户模式?
- node.js - 使用 Stripe API 向现有产品添加计划
- python - IndexError:只有整数、切片 (`:`)、省略号 (`...`)、numpy.newaxis (`None`) 和整数或布尔数组是有效的索引 men2n
- javascript - 在 API Excel Javascript 中操作电子表格和用户界面(小部件,..)?
- git - 命令 git checkout "." 是什么意思?做?
- python - 在python中比较2个字典的时间复杂度是多少