【发布时间】:2021-11-30 03:10:21
【问题描述】:
在以非常复杂的方式描述问题之前,我想知道如何在return Promise 中一个接一个地执行多个依赖等待,而不会在我的return Promise 块中获取新数据。换句话说,我只想让我的 try 块作为一个语句执行。
const handler = (payload) => {
return new Promise(async (resolve, reject) => {
try {
const exists = await getRedis(payload)
if(exists === null) {
await setRedis(payload)
await write2Mongo(payload)
resolve()
} else {
resolve()
}
} catch (err) {
reject(err)
}
});
};
具体来说,它是关于 RabbitMQ ("amqplib": "^0.8.0"),有效载荷飞入的地方。我想首先检查它们是否被系统识别。如果没有,我想在 Redis 中设置它们(“async-redis”:“^2.0.0”),然后将它们写入 MongoDB(“mongoose”:“^6.0.9”)。因为我从 RabbitMQ 收到了很多消息,所以一开始它工作正常,然后我从 Mongo 收到“重复键错误”。这是因为我的第一个 getRedis 返回一个空值。在将数据写入 Redis 和 MongoDB 时,第二条消息进入我的块并从 getRedis 获取“null”值,因为该消息尚未通过 setRedis 设置。
正如我所读到的,这是一个错误处理错误的反模式。但不幸的是,相应的帖子并没有解决我的问题。
你能帮帮我吗?
【问题讨论】:
-
你不需要promise构造函数来包装已经返回promise的东西。
-
不幸的是,这不起作用。假设 getRedis 需要 1 秒 setRedis 需要 3 秒 write2Mongo 需要 5 秒 一条消息到达,getRedis 需要 1 秒。 if 语句执行完毕,setRedis 需要 3 秒的时间来写。与此同时,另一条消息到达 getRedis 并获取值 null,因为 setRedis 尚未写入此 ID,并将此信息传递给 write2Mongo,这会引发重复键错误,因为它是之前写入的。我需要一种方法,让 getRedis 在 setRedis 和 write2Mongo 完成之前不会收到另一条消息。
标签: node.js mongodb redis async-await es6-promise