【发布时间】:2018-11-13 15:31:18
【问题描述】:
我有以下代码,在将响应发送回客户端之前,我无法弄清楚我需要做什么才能完成整个过程。基本上,我正在寻找客户端在方法中的所有内容完成或出错后收到响应,而不是之前。
我尝试了几件事,移动了一些东西并添加了一些甚至可能不需要的 .then() 和 .catch() 块。我对 NodeJs 还很陌生,所以虽然我了解事情是如何工作的,但我仍然不习惯异步编码。
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);
})
})
作为此过程的一部分,上面的代码运行并且确实在我们的数据库中运行了一些东西,但是在过程完成之前我收到了“步骤标记完成”解析消息。 由于解析是在流程结束之前完成的,因此我永远无法将任何拒绝()错误返回给客户端,因为已经调用了解析。
提前致谢。
【问题讨论】:
-
我不清楚您为什么同时使用 async/await 语法 和 调用
.then()等;前者通常取代后者。我不确定这是否会产生影响,但这对我来说是一个标志,你正在做这两个,我不希望它们起作用。 -
是的,我只是想添加一些东西来看看它是否会起作用。它最初没有 .then()s。但是我上面的这个版本是我得到的最接近的版本,因为当我在客户端执行该过程时,它确实会等待几秒钟才能发回该消息……而最初它会立即将其发回。