Javascript AWS SDK是否等待异步调用完成?

Javascript AWS SDK是否等待异步调用完成?,javascript,aws-sdk,aws-sdk-js,asynchronous-javascript,Javascript,Aws Sdk,Aws Sdk Js,Asynchronous Javascript,AWS SDK文档不太清楚何时/如何/是否可以同步异步服务调用。例如,此页面()显示: 通过SDK发出的所有请求都是异步的 然后在这一页()上写着: 当返回成功响应或错误数据时,将执行此回调函数。如果方法调用成功,则响应的内容可用于数据参数中的回调函数。如果调用未成功,错误参数中会提供有关失败的详细信息 但它没有说明如何等待回调函数完成 例如,这个调用是异步的还是同步的 new AWS.EC2().describeInstances(function(error, data) { if (e

AWS SDK文档不太清楚何时/如何/是否可以同步异步服务调用。例如,此页面()显示:

通过SDK发出的所有请求都是异步的

然后在这一页()上写着:

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

但它没有说明如何等待回调函数完成

例如,这个调用是异步的还是同步的

new AWS.EC2().describeInstances(function(error, data) {
  if (error) {
    console.log(error); // an error occurred
  } else {
    console.log(data); // request succeeded
  }
});
返回describeInstances()后,是否可以假定回调已被调用?如果没有,我怎么能等到它出现呢

编辑:

因此,我尝试按照建议编写一些异步/等待代码,但不起作用:

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()的结果,它正在等待承诺p,但结果如下:

>>1 Promise { <pending> }
>>2 Promise { <pending> }
>1承诺{}
>>2承诺{}
脚本只是在没有任何保证的情况下退出


在Node.js中是否有可能获取异步函数/承诺的返回值?我正在绞尽脑汁思考在Python中这会有多简单。

异步调用完成后,作为参数传递的函数将启动。该函数有两个参数(错误、数据)

  • 第一个参数是“error”。如果有错误,此参数将包含错误消息。否则它是空的
  • 第二个参数是数据。如果没有错误,则此变量包含所需的数据
检索数据的一种方法是使用承诺

const getdescripbeinstances=新承诺((解析、拒绝)=>{
新的AWS.EC2().DescriptionInstances(函数(错误、数据){
如果(错误)返回拒绝(错误);
解析(数据);
});
}
异步函数functionToDoSomethingWithData(){
试一试{
const descripbeinstances=wait getdescripbeinstances();
}
捕获(错误){
//处理错误
}

}
您绝对不能假设调用了回调(否则,您为什么还要使用回调?)。但是,如果函数functionToDosMethingWithData是异步的,我不需要找到一种方法来等待它吗?如果你想等待functionTosTosMethingWithData,你需要在另一个异步函数中调用它。请注意,你需要将wait放在它之前。这可能有助于你理解函数的功能如何等待我的异步函数协同工作那么完成吗?这是错误的。
getDescriptibeInstances
需要是一个返回承诺的函数。请参阅一个很好的示例,说明如何将函数与async/await一起使用。既然SDK现在支持承诺,那么这个答案仍然是最好的方法吗?还是使用此处描述的async/await更好?