Javascript 在异步lambda函数中,从回调函数返回值的正确方法是什么?

Javascript 在异步lambda函数中,从回调函数返回值的正确方法是什么?,javascript,node.js,amazon-web-services,asynchronous,aws-lambda,Javascript,Node.js,Amazon Web Services,Asynchronous,Aws Lambda,我使用的客户端只支持回调签名,因此,我希望确保在从回调函数返回值时使用最佳实践。我目前正在将其包装成一个承诺,并将该承诺返回到lambda运行时。下面是我的功能代码/格式 const client = new SomeClient(); exports.handler = async (event, context) => { try { return new Promise((resolve, reject) => { client.get(functio

我使用的客户端只支持回调签名,因此,我希望确保在从回调函数返回值时使用最佳实践。我目前正在将其包装成一个承诺,并将该承诺返回到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中,这将花费更多的执行时间和费用。

这正是

采用遵循常见错误优先回调样式的函数,即将
(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))()
在您提供的代码中,您没有使用
事件
上下文
参数-

const client =
  new SomeClient()

exports.handler = _ =>
  util.promisify(client.get.bind(client))()
如果你想的话,你甚至可以把这个再缩短一点-

const client =
  new SomeClient()

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

这正是我们的目的

采用遵循常见错误优先回调样式的函数,即将
(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))()
在您提供的代码中,您没有使用
事件
上下文
参数-

const client =
  new SomeClient()

exports.handler = _ =>
  util.promisify(client.get.bind(client))()
如果你想的话,你甚至可以把这个再缩短一点-

const client =
  new SomeClient()

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

1) 在try块中,您返回一个承诺,如果您希望捕获触发,您需要等待这个承诺。如文所述,只有在承诺的形成过程中出现错误,而不是拒绝承诺的情况下,才会触发该错误。2)您捕捉到一个错误以返回承诺。一般来说,如果你想计算一些需要执行时间的东西,而使用aws lambda,这是你需要付费的东西,那么这不太可能有用。承诺、回调或异步/等待在下面都是一样的,使用这样或那样的语法都不会节省宝贵的金钱。@LevKuznetsov感谢您的回复。除了try/catch未正确使用之外,返回承诺是否是从回调返回值的最佳方式?1)在try块中,您返回一个承诺,如果希望捕获触发,则需要等待此承诺。如文所述,只有在承诺的形成过程中出现错误,而不是拒绝承诺的情况下,才会触发该错误。2)您捕捉到一个错误以返回承诺。一般来说,如果你想计算一些需要执行时间的东西,而使用aws lambda,这是你需要付费的东西,那么这不太可能有用。承诺、回调或异步/等待在下面都是一样的,使用这样或那样的语法都不会节省宝贵的金钱。@LevKuznetsov感谢您的回复。除了try/catch没有正确使用之外,返回承诺是从回调返回值的最佳方式吗?