【问题标题】:Lambda function not running other async function even with await added to it即使添加了等待,Lambda 函数也不会运行其他异步函数
【发布时间】:2021-02-21 22:38:24
【问题描述】:

我有一个 Lambda 函数,它没有运行我正在使用 await 的异步函数。我猜其他东西是异步的,我需要等待它,尽管我不确定什么可以/应该等待,因为 redis 包的文档没有谈论我看到的承诺或异步。我尝试将await 放在clienthmset... 前面,但VS Code 说我等不及了。我有哪些选择可以让它正常运行?

这是我想出的最小可重现代码,请注意,此示例中唯一未包含的内容是我的记录器、我的导入和我的客户端设置(有密码和主机名)

const loadRedis = async (message) => {
  client.hmset(`${message.region}:${message._id}`, message, (err, res) => {
    if(err) {
      logger.error(`Error: ${JSON.stringify(err)}`)
      reject(err)
    }
    if(res) {
      logger.info(`Response: ${JSON.stringify(res)}`)
      resolve(res)
    }
  })
}

module.exports.loader = async (event, context, callback) => {
  context.callbackWaitsForEmptyEventLoop = false;
  let input = JSON.parse(event.Records[0].body);
  let message = input.Message

  
  const result = await loadRedis(message)
  logger.info(message)
  logger.info(result)
  
  let output = result
  callback(null, output);
};

CloudWatch Logs 中的日志显示正在查找消息日志,但返回的结果除了日志级别之外一无所有。

【问题讨论】:

    标签: javascript node.js asynchronous redis async-await


    【解决方案1】:

    loadRedis 被声明为async,但你没有返回任何东西,所以它并不是真的在等待任何东西..

    也许你只需要这样做:

    const loadRedis = async (message) => {
      return new Promise((resolve, reject) => {
        return client.hmset(`${message.region}:${message._id}`, message, (err, res) => {
          if(err) {
            logger.error(`Error: ${JSON.stringify(err)}`)
            reject(err)
          }
          if(res) {
            logger.info(`Response: ${JSON.stringify(res)}`)
            resolve(res)
          }
        })
      }
    }
    

    【讨论】:

    • 感谢您的回复,redis 包不支持承诺,所以我猜它已经过时了。我以为它会通过调用 resolve/reject 来返回,我猜不是?
    • 不,但您可以自己返回承诺...查看编辑
    • 谢谢,我会试一试,我之前做过类似的事情,但没有回报
    • 终于有时间测试了,效果很好,非常感谢您的帮助。
    猜你喜欢
    • 2020-12-23
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 2023-03-13
    • 2019-11-28
    • 1970-01-01
    • 2020-09-02
    相关资源
    最近更新 更多