【发布时间】:2019-07-03 12:58:36
【问题描述】:
我对整个 Web 开发还很陌生,所以我不太了解 Promise 和 async/await。我正在尝试将职位发布网站作为一个项目来构建,但由于我无法使特定的代码按我想要的方式运行而被卡住了。
在下面的 sn-p 中,发布特定工作要求的招聘人员希望查看与工作要求相关的申请人的技能。因此,代码首先会从 mongodb 集合中获取工作详细信息和相关申请人的详细信息。然后它会尝试先存储申请人所需的技能,然后将申请人的所有技能存储在技能数组中。只有在将上述所有数据存储在技能[]中之后,代码才应该以最后一个 json 响应。但它的行为不像我想要的那样,它在存储完成之前做出响应。有人可以指导我如何使其“同步”吗?
注意:我删除了所有错误处理以使 sn-p 更短。此外,申请人具备 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
【问题讨论】:
-
请创建minimal complete verifiable example。删除错误处理是一个开始,但是在那个庞大的代码转储中你有 100 种不同的事情发生。减少到1个,最好不超过20~30 LOC。您可以在大约 10 分钟内演示 async/await 的使用。
-
我之前看到过同样的帖子,但无法正确使用 async/await。
-
为了将来参考以防止您的问题被过早关闭,如果您有一个问题关于关于 SO 的问题和/或它的答案,您需要将该信息包含在您的问题,包括指向特定问题的链接,以及可能指向您不理解的特定答案的链接。请将您的问题编辑为具体关于您从另一个问题的答案中未能理解的内容(例如this one)。否则它只是一个骗局,将被关闭。
-
它已经是异步的,不能同步,这就是dupe question的意思。它可能看起来类似于与 async/await 同步,但仅仅是因为它被设计成这样。我建议从原始的 Promise 开始,一旦你能很好地理解它们,就转向 async/await,因为 async/await 是 Promise 的语法糖,如果不知道脱糖代码是什么样子,你就无法有效地使用它。 希望有人可以使其“同步” - SO 是一个有用的社区,但“为我编写代码”缺乏研究的问题没有得到很好的接受。
标签: javascript node.js async-await es6-promise