对于何时/如何/是否可以使异步服务调用同步,AWS开发工具包文档并不十分清楚。例如,此页面(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()返回之后,我可以假定该回调已被调用吗?如果没有,我怎么能等到它呢?
编辑:
所以我尝试按照建议编写一些异步/等待代码,但是它不起作用:
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));
现在,我看到它的方式是等待getPro()的结果,该结果正在等待Promise p,但这是结果:
>>1 Promise { <pending> }
>>2 Promise { <pending> }
该脚本仅退出而没有任何希望。
在Node.js中是否有可能永远获得异步函数/承诺的返回值?我对用Python这么简单感到很吃惊。
答案 0 :(得分:1)
异步调用完成后,作为参数传递的函数将启动。该函数有两个参数,(错误,数据)。
一种检索数据的方法是例如使用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中,您可以将结果存储在变量中。
需要将其放在异步函数中(如示例所示),并在需要等待该函数完成之前调用place await。