Luego de indagar en varios repositorios y páginas al final nos hemos encontrado la resolución que te enseñamos más adelante.
Solución:
Su enfoque usando await
en un async
then
la devolución de llamada funcionará, pero es innecesariamente complejo si todos lo que quieres hacer es llamar al async
función y hacer que su resultado se propague a través de la cadena. Pero si está haciendo otras cosas y quiere el beneficio de sintaxis de async
funciones, está bien. Volveré a eso en un momento.
async
las funciones devuelven promesas, por lo que solo devuelve el resultado de llamar a su función:
function functionThatCannotHaveAsyncKeyword()
functionA()
.then(function()
return functionB(someArgument);
)
.then(function()
console.log('last');
); // <=== Note: You need a `catch` here, or this function needs
// to return the promise chain to its caller so its caller can
// handle errors
si quieres pasar functionA
el valor de resolución en functionB
puedes hacerlo aún más directamente:
functionA()
.then(functionB)
// ...
Cuando devuelves una promesa de un then
devolución de llamada, la promesa creada por la llamada a then
está esclavizado a la promesa de volver.
Ejemplo:
const wait = (duration, ...args) => new Promise(resolve =>
setTimeout(resolve, duration, ...args);
);
async function functionA()
await wait(500);
return 42;
async function functionB()
await wait(200);
return "answer";
functionB()
.then(result =>
console.log(result); // "answer"
return functionA();
)
.then(result =>
console.log(result); // 42
)
.catch(error =>
// ...handle error...
);
Volviendo a su enfoque usando un async
then
devolución de llamada: eso también funciona y tiene sentido cuando estás haciendo más cosas:
const wait = (duration, ...args) => new Promise(resolve =>
setTimeout(resolve, duration, ...args);
);
async function functionA()
await wait(500);
return 42;
async function functionB()
await wait(200);
return "answer";
functionB()
.then(async (result) =>
console.log(result); // "answer"
const v = await functionA();
if (v < 60)
console.log("Waiting 400ms...");
await wait(400);
console.log("Done waiting");
console.log(v); // 42
)
.catch(error =>
// ...handle error...
);
Puede usar la promesa dentro del primer método como
function functionThatCannotHaveAsyncKeyword()
return new Promise(async(resolve, reject)=>
await functionA();
await functionB();
console.log('last');
resolve();
);
async function functionA()
console.log('first');
await someServiceThatMakesHTTPCall();
async function functionB()
console.log('second');
await someServiceThatMakesHTTPCall();
Sección de Reseñas y Valoraciones
Si piensas que ha sido provechoso nuestro artículo, nos gustaría que lo compartas con el resto programadores y nos ayudes a extender nuestro contenido.