Esperas Asincrónicas - Async / Await
Las async
no pueden ser utilizados en es5
deben ser usados en es6
o superior.
En TypeScript cuando código JS se está ejecutando (sincronamente) y utiliza una función la cual contiene una o más promesas se podrá utilizar la palabra reservada await
para parar la ejecución del código JS hasta que la función termine correctamente, en caso de fallo, está función generará un error de manera sincrona que podremos atrapar mediante un try catch
.
// ----------- test.ts -----------
// No es código de verdad solamente es la prueba de concepto
async function foo() {
try {
var val = await getMeAPromise();
console.log(val);
}
catch(err) {
console.log('Error: ', err.message);
}
}
- Si la función termina entonces devolverá un valor
- Si la función falla devolverá un error que podremos capturar
Esto convierte drasticamente la programación asíncrona tan fácil como la programación síncrona. ya que cumple 3 requisitos indispensables:
- Capacidad de pausar la función en tiempo de ejecución
- Capacidad de pasarle valores a funciones
- Capacidad de lanzar excepciones en caso de fallo
El código que genera el ejemplo de arriba debería ya sonar de algo ya que esa es la sintaxís utilizada en TypeScript para crear generators
, es decir, el código previamente visto se convertiría en:
// No olvideís que al no tener la función que genera las peticiones
// Este código no funciona
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator.throw(value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments)).next());
});
};
// No es código de verdad solamente es la prueba de concepto
function foo() {
return __awaiter(this, void 0, void 0, function* () {
try {
var val = yield getMeAPromise();
console.log(val);
}
catch (err) {
console.log('Error: ', err.message);
}
});
}
Obviamente esto no es lo mismo que lo que se explica en la lección anterior sino una versión más compleja.