【问题标题】:What is the correct way to return a value from a callback function in an async lambda function?从异步 lambda 函数中的回调函数返回值的正确方法是什么?
【发布时间】:2020-10-17 03:31:37
【问题描述】:

我正在使用仅支持回调签名的客户端,因此,我想确保在从回调函数返回值时使用最佳实践。我目前将它包装在一个承诺中并将承诺返回给 lambda 运行时。以下是我拥有的功能代码/格式。

const client = new SomeClient();

exports.handler = async (event, context) => {
  try {
    return new Promise((resolve, reject) => {
      client.get(function (err, response) {
        if (err) {
          reject(err);
        } else {
          resolve(response);
        }
      });
    });
  } catch (err) {
    return err;
  }
};

我知道我可以使用同步 lambda 函数并在返回之前等待响应。但这会花费更多的执行时间并在 AWS lambda 中产生更多费用。

【问题讨论】:

  • 1) 在你的 try 块中,你返回一个 promise,如果你想触发 catch,你需要等待这个 promise。正如所写的那样,它只有在承诺的形成而不是拒绝的错误时才会触发。
  • 2) 你发现一个错误来返回它。这不太可能有用
  • 3) 一般而言,如果您想要计算需要花费执行时间的东西,而使用 aws lambda,这是您需要付费的东西。 Promise 或 callbacks 或 async/await 在下面都是相同的,您不会通过使用一种或另一种语法来节省宝贵的便士。
  • @LevKuznetsov 感谢您的回复。除了没有正确使用 try/catch 之外,返回 Promise 是否是从回调中返回值的最佳方式?

标签: javascript node.js amazon-web-services asynchronous aws-lambda


【解决方案1】:

这就是util.promisify的确切目的

采用常见的错误优先回调风格的函数,即将(err, value) => ...回调作为最后一个参数,并返回一个返回承诺的版本。

你的代码变成-

const client =
  new SomeClient()

exports.handler = async (event, context) =>
{ const get = util.promisify(client.get.bind(client))
  return await get()
}

与 - 相同

const client =
  new SomeClient()

exports.handler = (event, context) =>
  util.promisify(client.get.bind(client))()

在您提供的代码中,您没有使用 eventcontext 参数 -

const client =
  new SomeClient()

exports.handler = _ =>
  util.promisify(client.get.bind(client))()

因此,如果您愿意,甚至可以进一步缩短 -

const client =
  new SomeClient()

exports.handler =
  util.promisify(client.get.bind(client))

【讨论】:

    猜你喜欢
    • 2019-07-04
    • 2021-10-30
    • 2021-02-20
    • 2018-05-30
    • 2011-09-08
    • 2011-04-26
    • 1970-01-01
    • 2017-12-09
    • 2018-01-03
    相关资源
    最近更新 更多