AWS SDK如何等待异步调用完成?

3
AWS SDK文档并没有很清楚地说明何时/如何/是否可以将异步服务调用转换为同步。例如,此页面(https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/calling-services-asynchronously.html)说:

SDK通过异步方式处理所有请求。

然后在这个页面(https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/using-a-callback-function.html)上说:

当成功响应或错误数据返回时,此回调函数执行。如果方法调用成功,则响应内容在data参数中对回调函数可用。如果调用不成功,则提供有关失败的详细信息在error参数中。

但它没有说明如何等待该回调函数完成。
例如,这个调用是异步还是同步的?
new AWS.EC2().describeInstances(function(error, data) {
  if (error) {
    console.log(error); // an error occurred
  } else {
    console.log(data); // request succeeded
  }
});

describeInstances()返回后,我可以假设回调已经被调用了吗?如果没有,我该如何等待它被调用?
编辑:我尝试按照建议编写了一些async/await代码,但它不起作用:
var AWS = require('aws-sdk');
AWS.config.update({region: 'us-east-1'});
var s3 = new AWS.S3({apiVersion: '2006-03-01'});
let data = null;
r = s3.listBuckets({},function(e,d){
    data = d;
})
p=r.promise();
console.log(">>1",p);

async function getVal(prom) {
    ret = await prom;
    return ret;
}
console.log(">>2",getVal(p));

我认为现在的情况是,我正在等待getVal()的结果,而getVal()正在等待Promise p的结果,然而这是最终的结果:

>>1 Promise { <pending> }
>>2 Promise { <pending> }

这个脚本看起来没有完成任何承诺就退出了。
在Node.js中是否有可能获取异步函数/承诺的返回值?我正在思考这在Python中是多么简单。

你绝对不能假设回调函数被调用了(否则,为什么你需要使用回调呢?)[可能是重复内容] (https://dev59.com/RGYq5IYBdhLWcg3wwDRA)。 - James
1个回答

3

当异步调用完成后,将启动作为参数传递的函数。该函数有两个参数(error, data)。

  • 第一个参数是'error'。如果有错误,则此参数包含错误消息。否则为空。
  • 第二个参数是'data'。如果没有错误,则此变量包含所需的数据。

检索数据的一种方法是例如使用promise。

const getDescribeInstances = new Promise((resolve, reject) => {
  new AWS.EC2().describeInstances(function(error, data) {
    if (error) return reject(error);

    resolve(data);
  });
}

async function functionToDoSomethingWithTheData(){
  try {
    const describeInstances = await getDescribeInstances();
  }
  catch(error) {
    //handle error
  }
}

将AWS函数封装在一个Promise中,可以将结果存储在变量中。

需要将其放置在异步函数中(如示例所示),并在调用它之前放置await以等待函数完成。


但是如果函数 functionToDoSomethingWithTheData 是异步的,那我不是得找到一种等待它的方式吗? - aaa90210
如果你想等待函数functionToDoSomethingWithTheData完成,你需要在另一个异步函数内调用它。注意,在调用之前需要加上await关键字。也许这可以帮助你理解async/await功能。 - Oscar R
我该如何等待我的异步函数完成呢? - aaa90210
这是错误的。getDescribeInstances需要成为一个返回Promise的函数。请参考https://flaviocopes.com/node-promisify/,了解将函数转换为可与async/await一起使用的Promise的良好示例。 - stuart
这个答案是否仍然是最佳方法,因为SDK现在支持promises了?https://aws.amazon.com/blogs/developer/support-for-promises-in-the-sdk/ 还是更好地使用在这里描述的async/await?https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/using-async-await.html - Lazor
发现了一些东西... const { Buckets } = await this.getService().listBuckets({}).promise(); - Lazor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接