如何在 Node.js 中使用“async/await”和“promises”进行同步执行?

凯文·泰尼·罗伊

作为一个整体,我对 Web 开发还很陌生,所以我不太了解 promise 和 async/await。我正在尝试将招聘网站构建为一个项目,但由于无法使特定代码按照我的意愿运行而陷入困境。

在以下代码段中,发布特定工作要求的招聘人员希望查看与工作要求相关的申请人的技能。所以代码会首先从 mongodb 集合中获取工作详细信息和相关申请人的详细信息。然后它会尝试首先存储申请人所需的技能,然后将申请人的所有技能存储在技能数组中。只有在将上述所有数据存储在 Skills[] 中之后,代码才应该以最后一个 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。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在node.js的async.each内进行同步http调用

来自分类Dev

如何在Node.js中使用useMasterKey进行解析?

来自分类Dev

使用Node.js执行同步获取请求

来自分类Dev

Node.js如何在运行时如此快速地执行同步“ require()”调用?

来自分类Dev

如何在Node.js中使用If语句和for循环?

来自分类Dev

如何在Node.js和Express中使用PATCH

来自分类Dev

如何在Node JS中执行forloop

来自分类Dev

如何在Node.js中使用猫鼬进行原子查找和保存

来自分类Dev

如何在Node.js中执行一系列同步和异步功能

来自分类Dev

如何使Node js同步?

来自分类Dev

如何在同步循环内的Node.JS中使用setTimeout?

来自分类Dev

如何在Node.js中使用XHR API?

来自分类Dev

如何在HTML中使用node.js库?

来自分类Dev

如何在sails.js中使用node-inspector?

来自分类Dev

node.js:如何在koa中使用护照

来自分类Dev

如何在Node.js中使用Swig输出JSON

来自分类Dev

如何在Node JS中使用事件?

来自分类Dev

如何在node.js中使用marklogic查询结果

来自分类Dev

如何在PyCharm中使用Intellij Node.js插件?

来自分类Dev

如何在Node.JS中使用SQL

来自分类Dev

如何在node.js中使用token(post)Mysql?

来自分类Dev

如何在node.js中使用window.sessionstorage

来自分类Dev

如何在Node.js中使用OpenVPN?

来自分类Dev

如何在Node.js Lambda中使用请求模块

来自分类Dev

如何在Node JS中使用嵌套映射

来自分类Dev

如何在Node.js中使用多线程或进程

来自分类Dev

如何在Google Apps脚本中使用Node js(Buffer)

来自分类Dev

如何在node.js中使用Error.captureStackTrace

来自分类Dev

如何在Node.js中使用EventEmitter