等待nodeJs异步/承诺过程结束,然后再向客户端发送响应

时间:2018-11-13 15:31:18

标签: node.js express

我有以下代码,我无法弄清楚在将响应发送回客户端之前完成整个过程所需要做的事情。基本上,我希望客户端在方法中的所有操作完成或出现错误后立即收到响应,而不是之前。

我尝试了几件事,四处移动,并添加了甚至可能不需要的.then()和.catch()块。我对NodeJ还是很陌生,因此虽然我了解事情是如何工作的,但我仍然不习惯异步编码。

let markStepsComplete = async function() {

let stepsToProcess = new Multimap();//multimap JS npm
let results = await dbUtils.getCompletedSteps();
results.forEach(result => {
    stepsToProcess.set(result.ticket_id, result.step_id);
});
return new Promise((resolve,reject)=>{
    stepsToProcess.forEachEntry(async function(entry, key) {
        let payload = {
            ticketId: key,
            stepIds: entry
        }
        let response = await updateStep(payload)//returns promise
            if (response.statusCode === 200) {
                await Promise.all(payload.stepIds.map(async (stepId) => {
                    try {
                        await dbUtils.markStepsCompleted(stepId, payload.ticketId);
                    } catch(err) {
                        reject(err);
                    }
                }));
            }
            else {
                await Promise.all(payload.stepIds.map(async (stepId) => {
                try {
                    await dbUtils.markStepsProcessed(stepId, payload.ticketId, response.statusCode);
                } catch(err) {
                    console.log(err);
                    reject(err);    
                }
                }));

            }


    });
    resolve('Steps Marked Complete');  


});//promise end



}

这是我现在正在测试的路径,正在调用上述方法。 updateStep()方法是实际调用外部REST API的HTTP请求的方法。这似乎在兑现承诺。

app.use('/api/posts',async (req,res,next)=>{

let data = await markStepsComplete.markStepsComplete()
.then((data)=>{
    res.status(200).json({message: data})
})
.catch((e)=>{
    console.log('error from catch:',e);
})

})

作为该过程的一部分,上面的代码运行并且确实在数据库中运行了一些东西,但是在过程完成之前,我会得到“步骤已标记为完成”解决消息。 由于已在过程结束之前命中了解决方法,因此由于已经调用了解决方法,所以我永远无法获得任何reject()错误返回给客户端。

谢谢。

1 个答案:

答案 0 :(得分:1)

我注意到了此代码段,并希望对其进行调用,因为它无法正常工作:

payload.stepIds.forEach(async (stepId) => {
  try {
    await dbUtils.markStepsProcessed(stepId, payload.ticketId, response.statusCode);
  } catch(err) {
    console.log(err);
    reject(err);    
  }
});

当遍历需要异步获取的项目数组时,您可以执行以下操作:

await Promise.all(payload.stepIds.map(async (stepId) => {
  try {
    await dbUtils.markStepsProcessed(stepId, payload.ticketId, response.statusCode);
  } catch(err) {
    console.log(err);
    reject(err);    
  }
}));