В документации 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
}
});
После того, как descriptionInstances () вернулась, могу ли я считать, что обратный вызов был вызван? Если нет, то как я могу ждать, пока это произойдет?
Edit:
Итак, я попытался написать некоторый асинхронный / ожидающий код, как это было предложено, но он не работает:
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 (), который ожидает Promise p, но это результат:
>>1 Promise { <pending> }
>>2 Promise { <pending> }
Сценарий просто завершается без каких-либо обещаний, заканчивая внешностью.
Возможно ли когда-либо в Node.js получить возвращаемое значение асинхронной функции / обещания? Я думаю о том, как это было бы просто в Python.