Saltar al contenido

js – Cómo llamar a una función asíncrona dentro de una Promesa .then()

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 asyncthen 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 functionAel valor de resolución en functionBpuedes 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 asyncthen 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *