【问题标题】:Using multiple awaits within a Promise that are dependent on each other在一个相互依赖的 Promise 中使用多个等待
【发布时间】: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


【解决方案1】:

在您描述的场景中,您需要一个可以连续处理它的队列

let payloads = [];
const handler = payload => payloads.push(payload);


;(async function insertDistincPayloads() {
  for (let i=0; i < payloads.length; i++) {
    const exists = await getRedis(payload)
    if(exists === null) {
      await setRedis(payload)
      await write2Mongo(payload)
    }
  }
  payloads = []
  setTimeout(insertDistincPayloads(), 100); // loop continuously with a small delay
})();

对不起我的英语不好:-)

【讨论】:

    猜你喜欢
    • 2018-05-20
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2017-01-15
    • 1970-01-01
    相关资源
    最近更新 更多