es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Javascript: ¿La función async en otra función async no espera por la respuesta?

Problema

¿La función asíncrona en otra función asíncrona no espera?

Código

javascript
// onConfirmed se ejecuta después de confirmar en el modal
onConfirmed={async () => {
const res = await submit(submitData) // publicar datos y devolver algunos datos
if (!res.error) {
const resFb= await Fb(data)
console.log(resFb) // ***se ejecuta antes de esperar "await Fb(data)""
} else {
// manejar error
}
}}

javascript
// Función Fb
export const Fb = async (data) => {
const body = {
method: 'share',
href: 'https://hogehoge',
display: 'popup',
hashtag: '#hogehoge',
quote: content: ${data.content},
}
return FB.ui(body, async (res) => {
if (res !== undefined && !res.error_code) {
return await Api.put(body) // poner en el propio servidor (se ejecuta aquí sin problema)
} else {
return res
}
})
}

SDK de Facebook (FB.ui())

Necesito obtener un valor adecuado de resFb que espere la función asíncrona.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución

    El problema parece estar con el método FB.ui() utilizado dentro de la función Fb. Este método en sí mismo no utiliza promesas y, por lo tanto, no se puede esperar directamente. Para solucionar este problema, se debe devolver una promesa desde la función asíncrona que se pasa a FB.ui().

    //Función Fb
    export const Fb = async (data) => {
      const body = {
        method: 'share',
        href: 'https://hogehoge',
        display: 'popup',
        hashtag: '#hogehoge',
        quote: `contenido: ${data.content}`,
      }
      //devolver una promesa que se resuelve/rechaza en función de la respuesta de FB.ui()
      return new Promise((resolve, reject) => {
        FB.ui(body, (res) => {
          if (res !== undefined && !res.error_code) {
            resolve(Api.put(body)) // poner en su propio servidor (se ejecuta aquí sin problemas)
          } else {
            reject(res)
          }
        })
      })
    }
    

    Al devolver una nueva promesa, podemos resolverla o rechazarla en función de la respuesta de FB.ui(). Esta promesa devuelta se puede usar para esperar la respuesta y la instrucción console.log para resFb se puede mover fuera de la estructura if-else.

    onConfirmed=async () => {
      const res = await submit(submitData) // publicar datos y devolver algunos datos
      if (!res.error) {
        try {
          const resFb = await Fb(data)
          console.log(resFb) // se ejecutará después de que la función se resuelva
        } catch (error) {
          // manejar el error
        }
      } else {
        // manejar el error
      }
    }
    

    Ahora, la instrucción console.log () para resFb se ejecutará después de que la promesa de Fb() se haya resuelto.

Comments are closed.