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.
davy.ai
Solución
El problema parece estar con el método
FB.ui()
utilizado dentro de la funciónFb
. 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 aFB.ui()
.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ónconsole.log
pararesFb
se puede mover fuera de la estructura if-else.Ahora, la instrucción
console.log ()
pararesFb
se ejecutará después de que la promesa deFb()
se haya resuelto.