

 La [Guía de referencia de la API de AWS SDK for JavaScript V3](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/) describe en detalle todas las operaciones de la API para la versión 3 (V3) de AWS SDK for JavaScript. 

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Llamadas asíncronas a servicios
<a name="calling-services-asynchronously"></a>

Todas las solicitudes que se realizan a través del SDK son asíncronas. Es importante tener esto en cuenta al escribir scripts de navegador. JavaScript la ejecución en un navegador web normalmente tiene un único hilo de ejecución. Tras realizar una llamada asíncrona a un AWS servicio, el script del navegador sigue ejecutándose y, en ese proceso, puede intentar ejecutar código que dependa de ese resultado asíncrono antes de que regrese.

Hacer llamadas asíncronas a un AWS servicio incluye administrar esas llamadas para que el código no intente usar los datos antes de que estén disponibles. En los temas de esta sección se explica la necesidad de administrar llamadas asíncronas y técnicas diferentes de detalles que puede utilizar para administrarlas.

Aunque puedes usar cualquiera de estas técnicas para administrar las llamadas asincrónicas, te recomendamos que las utilices para todos los códigos nuevos. async/await 

async/await  
Le recomendamos que utilice esta técnica, ya que es el comportamiento predeterminado en la versión 3.

promesa  
Utilice esta técnica en navegadores que no admitan async/await.

devolución de llamada  
Evite el uso de callbacks excepto en casos muy sencillos. Sin embargo, puede que le resulte útil en escenarios de migración.

**Topics**
+ [Administración de llamadas asíncronas](making-asynchronous-calls.md)
+ [Uso de async/await](using-async-await.md)
+ [Usa las promesas JavaScript](using-promises.md)
+ [Uso de una función de devolución de llamada anónima](using-a-callback-function.md)

# Administración de llamadas asíncronas
<a name="making-asynchronous-calls"></a>

Por ejemplo, la página de inicio de un sitio web de e-commerce permite iniciar sesión a los clientes que regresan. Parte del beneficio para los clientes que inician sesión es que, después de iniciar sesión, el sitio se personaliza a sí mismo para adaptarse a sus preferencias concretas. Para que esto suceda:

1. El cliente tiene que iniciar sesión y validarse con sus credenciales de inicio de sesión.

1. Las preferencias del cliente se solicitan a partir de una base de datos del cliente.

1. La base de datos proporciona las preferencias del cliente que se utilizan para personalizar el sitio antes de que se cargue la página.

Si dichas tareas se ejecutan de forma síncrona, cada una tiene que finalizar antes de que la siguiente pueda comenzar. La página web no puede acabar de cargarse hasta que no lleguen las preferencias del cliente desde la base de datos. Sin embargo, después de que la consulta de la base de datos se envíe al servidor, la recepción de los datos del cliente se puede retrasar o incluso generar errores debido a atascos en la red, un tráfico de base de datos excepcionalmente alto o una conexión de dispositivo móvil de mala calidad.

Para evitar que el sitio web se congele en estas condiciones, llame a la base de datos de forma asíncrona. Después de que se ejecute la llamada a la base de datos y se envíe su solicitud asíncrona, el código sigue ejecutándose según lo previsto. Si no administra correctamente la respuesta de una llamada asíncrona, el código puede intentar utilizar información que espera recibir de la base de datos cuando dichos datos todavía no están disponibles.

![\[Diferencia entre la ejecución síncrona y la ejecución asíncrona.\]](http://docs.aws.amazon.com/es_es/sdk-for-javascript/v3/developer-guide/images/async-vs-sync.png)


# Uso de async/await
<a name="using-async-await"></a>

En lugar de usar promesas, debería considerar la posibilidad de utilizar async/await. Las funciones asincrónicas son más simples y requieren menos código reutilizable que las promesas. Await solo se puede usar en las funciones asíncronas para esperar asincrónicamente un valor.

El siguiente ejemplo se utiliza async/await para enumerar todas las tablas de Amazon DynamoDB. ` us-west-2`

**nota**  
Para ejecutar este ejemplo:  
Instale el cliente de AWS SDK para JavaScript DynamoDB `npm install @aws-sdk/client-dynamodb` ingresándolo en la línea de comandos de su proyecto.
Asegúrese de haber configurado AWS las credenciales correctamente. Para obtener más información, consulte [Configuración de credenciales](setting-credentials.md). 

```
import {
  DynamoDBClient,
  ListTablesCommand
} from "@aws-sdk/client-dynamodb";
(async function () {
  const dbClient = new DynamoDBClient({ region: "us-west-2" });
  const command = new ListTablesCommand({});

  try {
    const results = await dbClient.send(command);
    console.log(results.TableNames.join('\n'));
  } catch (err) {
    console.error(err)
  }
})();
```

**nota**  
 No todos los navegadores admiten async/await. Consulte [las funciones asíncronas](https://caniuse.com/#feat=async-functions) para obtener una lista de los navegadores compatibles async/await . 

# Usa las promesas JavaScript
<a name="using-promises"></a>

Utilice el método AWS SDK para JavaScript v3 del cliente de servicio (`ListTablesCommand`) para realizar la llamada de servicio y gestionar el flujo asíncrono en lugar de utilizar devoluciones de llamada. El siguiente ejemplo muestra cómo obtener los nombres de sus tablas de Amazon DynamoDB en `us-west-2`.

```
import {
  DynamoDBClient,
  ListTablesCommand
} from "@aws-sdk/client-dynamodb";
const dbClient = new DynamoDBClient({ region: 'us-west-2' });

dbClient.listtables(new ListTablesCommand({}))
  .then(response => {
    console.log(response.TableNames.join('\n'));
  })
  .catch((error) => {
    console.error(error);
  });
```

## Coordinación de varias promesas
<a name="multiple-promises"></a>

En algunas situaciones, el código debe realizar varias llamadas asíncronas que requieren acción solo cuando todas han tenido una devolución correcta. Si administra estas llamadas a métodos asíncronas individuales con promesas, puede crear una promesa adicional que utilice el método `all`. 

Este método cumple esta promesa paraguas en el momento en que transfiere la matriz de promesas al método siempre y cuando dicha matriz de promesas se cumpla. Se transfiere a la función de devolución de llamada una matriz de los valores de las promesas que se transfieren al método `all`.

En el ejemplo siguiente, una AWS Lambda función debe realizar tres llamadas asíncronas a Amazon DynamoDB, pero solo puede completarlas después de cumplir las promesas de cada llamada.

```
const values = await Promise.all([firstPromise, secondPromise, thirdPromise]);

console.log("Value 0 is " + values[0].toString);
console.log("Value 1 is " + values[1].toString);
console.log("Value 2 is " + values[2].toString);

return values;
```

## Compatibilidad del navegador y Node.js con las promesas
<a name="browser-node-promise-support"></a>

Support for native JavaScript promise (ECMAScript 2015) depende del JavaScript motor y la versión en la que se ejecute el código. Para ayudarte a determinar la compatibilidad con JavaScript las promesas en cada entorno en el que deba ejecutarse el código, consulta la [tabla de ECMAScript compatibilidad que aparece](https://compat-table.github.io/compat-table/es6/) en GitHub.

# Uso de una función de devolución de llamada anónima
<a name="using-a-callback-function"></a>

Cada método de objeto de servicio puede aceptar una función de devolución de llamada anónima como último parámetro. La firma de dicha función de devolución de llamada es de la siguiente manera:

```
function(error, data) {
    // callback handling code
};
```

Esta función de devolución de llamada se ejecuta cuando se devuelve una respuesta correcta o datos de error. Si la llamada al método se realiza correctamente, el contenido de la respuesta está disponible en la función de devolución de llamada en el parámetro `data`. Si la llamada no se realiza correctamente, se proporcionan los detalles sobre el error en el parámetro `error`.

Normalmente el código contenido en la función de devolución de llamada realiza una prueba para detectar errores. Si el resultado de la prueba devuelve errores, los procesará. Si no se devuelve ningún error, el código recuperará los datos de la respuesta en el parámetro `data`. La forma básica de la función de devolución de llamada es similar a la de este ejemplo.

```
function(error, data) {
    if (error) {
        // error handling code
        console.log(error);
    } else {
        // data handling code
        console.log(data);
    }
};
```

En el ejemplo anterior, los detalles del error o de los datos devueltos se registran en la consola. A continuación se muestra un ejemplo que muestra una función de devolución de llamada transferida como parte de una llamada a un método en un objeto de servicio.

```
ec2.describeInstances(function(error, data) {
  if (error) {
    console.log(error); // an error occurred
  } else {
    console.log(data); // request succeeded
  }
});
```