如何使用“异步/等待”和“承诺”在Node.js的synchromous执行?
我是相当新的Web开发作为一个整体,所以我不明白的承诺和异步/等待了。我试图建立一个招聘启事网站作为一个项目,但卡住了因为我无法做出的行为,因为我想一个特定的代码块。
在下面的代码片段,谁发布的特定工作要求的招聘人员希望看到申请人是相关的工作要求的技能。因此,代码将首先得到这份工作的细节,并从MongoDB中收集有关申请人的详细信息。然后,它会尝试先存储申请人所需的技能,然后技能阵列中的申请人的所有技能。只有存储能力上述所有数据后,[],如果代码应与上次JSON响应。但它不表现得像我想和它的响应之前存储完成。可有人指导我如何让它“同步”?
注:我删除了所有的错误处理,使片段短。此外,申请人有2级需要的技能出的整体技能5。
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()
电话也是如此。
异步/等待和承诺的方式来组织的Javascript回调,这样他们就不会出现嵌套。它们使代码更易于阅读。但回调仍是嵌套和异步的。恰好解释如何转换代码,使用的承诺和异步/等待超出的范围,以回答。总之,你应该promisify your asynchronous functions, then you can await
their results。这绝对是值得一两天你的时间来熟悉JavaScript编码的这种方式。
临提示:如果你通过这种代码与调试步骤,使用步骤进了不少。
如何使用“异步/等待”和“承诺”在Node.js的synchromous执行?
我是相当新的Web开发作为一个整体,所以我不明白的承诺和异步/等待了。我试图建立一个招聘启事网站作为一个项目,但卡住了因为我无法做出的行为,因为我想一个特定的代码块。
在下面的代码片段,谁发布的特定工作要求的招聘人员希望看到申请人是相关的工作要求的技能。因此,代码将首先得到这份工作的细节,并从MongoDB中收集有关申请人的详细信息。然后,它会尝试先存储申请人所需的技能,然后技能阵列中的申请人的所有技能。只有存储能力上述所有数据后,[],如果代码应与上次JSON响应。但它不表现得像我想和它的响应之前存储完成。可有人指导我如何让它“同步”?
注:我删除了所有的错误处理,使片段短。此外,申请人有2级需要的技能出的整体技能5。
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()
电话也是如此。
异步/等待和承诺的方式来组织的Javascript回调,这样他们就不会出现嵌套。它们使代码更易于阅读。但回调仍是嵌套和异步的。恰好解释如何转换代码,使用的承诺和异步/等待超出的范围,以回答。总之,你应该promisify your asynchronous functions, then you can await
their results。这绝对是值得一两天你的时间来熟悉JavaScript编码的这种方式。
临提示:如果你通过这种代码与调试步骤,使用步骤进了不少。