【问题标题】:Why does function with callback not executed inside an async function?为什么带有回调的函数没有在异步函数中执行?
【发布时间】:2021-03-10 12:15:21
【问题描述】:

我正在使用 AWS 开发工具包,并且正在使用 Lambda 运行此代码。我注意到,当我在异步函数中使用带有回调的上传函数时,它不会执行该函数。

const aws = require('aws-sdk');

exports.handler = async (event) => {
  const s3 = new aws.S3();
  console.log('START UPLOAD')

  const params = {
    Bucket: 'practice-bucket',
    Key: 'hello.txt',
    Body: "hello",
  }
  
  s3.upload(params, function(err, data) {
    console.log(err, data);
  });

};

我知道如何完成这项工作。通过将函数更改为非异步函数或使用 await 并将 upload() 的响应转换为承诺。但是我还是很好奇它为什么不执行upload()函数呢?我希望它只是执行它只是一个常规功能,因为我没有告诉它等待。

【问题讨论】:

  • 尝试上传文件时可能出错。
  • 显然,无论有没有async,它总是在执行.upload()函数,而你的问题的前提只是混淆了。

标签: javascript node.js aws-sdk


【解决方案1】:

这就是 Javascript 的事件循环如何与异步函数一起工作,在您的情况下,函数在 s3.upload 完成之前返回。

您可以通过将 s3.upload 转换为 Promise,然后使用 await 获取结果并阻止异步处理程序的返回来解决此问题

await result = s3.upload(params).promise();

【讨论】:

  • 哦,这很有道理。如果没有等待,它将继续执行下一行代码,而无需等待完成被调用函数的执行。谢谢!
  • @DunkedOreo - 所以,它总是被调用,所以你的问题的前提是混乱的。您是否以某种方式认为它会阻塞并且函数在完成之前不会返回?因为即使添加 await 也不会阻止函数在您调用它时立即返回。当您点击其中的第一个 await 时,async 函数会立即返回。他们返回一个处于“待处理”状态的承诺。
  • @jfriend00 是的,是的。我不经常使用 JS,这就是为什么我仍然对异步函数的行为感到困惑。谢谢。
  • @DunkedOreo - 我感到困惑的是,为什么这是您所提问题的公认答案?无论您是否创建函数async,都会调用您的回调。据我所知,这与您在问题中提出的问题没有任何关系。而且,无论有没有async,您的函数都会在上传完成之前返回。
  • @jfriend00 有道理,先生。该答案未指定始终调用该函数,该函数未明确回答该问题。我接受了它,因为它解释了函数在函数完成之前返回。如果可以的话,我将提交对此答案的建议编辑,以使其更加明确。
猜你喜欢
  • 2021-01-06
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 2018-12-28
相关资源
最近更新 更多