AWS SDK ждать завершения асинхронного вызова? - PullRequest
0 голосов
/ 17 июня 2019

В документации 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.

1 Ответ

1 голос
/ 17 июня 2019

Когда асинхронный вызов выполнен, функция, переданная в качестве параметра, запустится. Эта функция имеет два параметра (ошибка, данные).

  • Первый параметр - «ошибка». Если есть ошибка, этот параметр содержит сообщение об ошибке. Остальное пусто.
  • Второй параметр - данные. Если ошибки нет, эта переменная содержит необходимые данные.

Одним из способов получения данных является, например, использование обещания.

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 внутри обещания, вы можете сохранить результат в переменной.

Он должен быть помещен в асинхронную функцию (показанную в примере), а вызываемое место ждет до того, как ждать, пока функция не будет выполнена.

...