Javascript 为什么带有回调的函数不在异步函数内执行?

Javascript 为什么带有回调的函数不在异步函数内执行?,javascript,node.js,aws-sdk,Javascript,Node.js,Aws Sdk,我正在使用AWS SDK,我正在使用Lambda运行此代码。我注意到,当我在异步函数中使用带有回调的upload函数时,它不会执行该函数 const aws = require('aws-sdk'); exports.handler = async (event) => { const s3 = new aws.S3(); console.log('START UPLOAD') const params = { Bucket: 'practice-bucket',

我正在使用AWS SDK,我正在使用Lambda运行此代码。我注意到,当我在异步函数中使用带有回调的upload函数时,它不会执行该函数

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);
  });

};

我知道怎么做。将函数更改为非异步函数,或者使用wait并将upload()的响应转换为承诺。但是我仍然很好奇为什么它不执行upload()函数?我希望它只是执行一个常规函数,因为我没有告诉它等待。

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

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

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

尝试上载文件时可能出现错误。显然,它总是在执行
.upload()
函数时使用或不使用
async
,并且您的问题的前提被混淆了。哦,这是有意义的。在不等待的情况下,它将继续执行下一行代码,而不等待完成被调用函数的执行。谢谢大家!@邓克多雷奥-所以,总是有人打电话,所以你的问题的前提是混乱的。您是否认为它会阻塞,并且函数在完成之前不会返回?因为即使添加
await
也不会阻止函数在您调用它时立即返回
async
函数在单击其中的第一个
wait
时立即返回。他们返回处于“待定”状态的承诺。@jfriend00是,是。我对JS的使用不多,这就是为什么我仍然对异步函数的行为感到困惑的原因。谢谢你。@DunkedOreo-我感到困惑的是,为什么这是你所问问题的公认答案?无论您是否使函数
异步
,都会调用您的回调。据我所知,这与你在问题中提出的问题无关。而且,您的函数在上传完成之前返回,无论是否使用
async
@jfriend00,这都是有意义的,先生。这个答案并没有指定函数总是被调用,这并没有明确回答这个问题。我接受了它,因为它解释了函数在函数完成之前返回。如果可以的话,我会提交一份对这个答案更明确的修改建议。