Baseline Widely available
La declaración de función async
define una función asÃncrona, la cual devuelve un objeto AsyncFunction
.
Es posible definir también funciones asÃncronas a través de una expresión de función async.
Pruébalofunction resolveAfter2Seconds() {
return new Promise((resolve) => {
setTimeout(() => {
resolve("resolved");
}, 2000);
});
}
async function asyncCall() {
console.log("calling");
const result = await resolveAfter2Seconds();
console.log(result);
// Expected output: "resolved"
}
asyncCall();
Sintaxis
async function name([param[, param[, ... param]]]) { statements }Parámetros
name
El nombre de la función.
param
El nombre de un argumento que se debe pasar a la función.
statements
Las declaraciones que conforman el cuerpo de la función.
Un objeto AsyncFunction
, que representa una función asÃncrona que ejecuta el código contenido dentro de la función.
Cuando se llama a una función async
, esta devuelve un elemento Promise
. Cuando la función async
devuelve un valor, Promise
se resolverá con el valor devuelto. Si la función async
genera una excepción o algún valor, Promise
se rechazará con el valor generado.
Una función async
puede contener una expresión await
, la cual pausa la ejecución de la función asÃncrona y espera la resolución de la Promise
pasada y, a continuación, reanuda la ejecución de la función async
y devuelve el valor resuelto.
Nota: La finalidad de las funciones async
/await
es simplificar el comportamiento del uso sÃncrono de promesas y realizar algún comportamiento especÃfico en un grupo de Promises
. Del mismo modo que las Promises
son semejantes a las devoluciones de llamadas estructuradas, async
/await
se asemejan a una combinación de generadores y promesas.
function resolveAfter2Seconds(x) {
return new Promise((resolve) => {
setTimeout(() => {
resolve(x);
}, 2000);
});
}
async function add1(x) {
const a = await resolveAfter2Seconds(20);
const b = await resolveAfter2Seconds(30);
return x + a + b;
}
add1(10).then((v) => {
console.log(v); // prints 60 after 4 seconds.
});
async function add2(x) {
const p_a = resolveAfter2Seconds(20);
const p_b = resolveAfter2Seconds(30);
return x + (await p_a) + (await p_b);
}
add2(10).then((v) => {
console.log(v); // prints 60 after 2 seconds.
});
Advertencia: No se deben confundir await
y Promise.all
En add1
, la ejecución se suspende durante dos segundos correspondientes al primer operador await
, y luego durante otros dos segundos correspondientes al segundo await
. El segundo temporizador no se crea hasta que el primero no se haya disparado ya. En add2
, ambos temporizadores se crean y, acto seguido, ambos reciben await
. Esto provoca la resolución en dos segundos y no cuatro, ya que los temporizadores se ejecutaron de manera simultánea. Sin embargo, ambas llamadas await
aún pueden ejecutarse en series, no en paralelo: esto no constituye ninguna aplicación automática de Promise.all
. Si se desea aplicar await
a dos o más promesas en paralelo, es preciso utilizar Promise.all
.
async
Una API que devuelva una Promise
tendrá como resultado una cadena de promesas, y dividirá la función en muchas partes. Estudie este código:
function getProcessedData(url) {
return downloadData(url) // returns a promise
.catch((e) => {
return downloadFallbackData(url); // returns a promise
})
.then((v) => {
return processDataInWorker(v); // returns a promise
});
}
Es posible reescribirlo utilizando un solo operador async
de esta manera:
async function getProcessedData(url) {
let v;
try {
v = await downloadData(url);
} catch (e) {
v = await downloadFallbackData(url);
}
return processDataInWorker(v);
}
Observe que, en el ejemplo anterior, no hay ninguna instrucción await
dentro de la instrucción return
, porque el valor de retorno de una async function
queda implÃcitamente dentro de un Promise.resolve
.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4