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.

Async Await Promises Typescript Obtener Indefinido

Así tengo mi función:

/** @ts-ignore eslint-disable */
declare var require: any
import generateString from "./Strings/GenerateString";
var txtomp3 = require("text-to-mp3");
const fs = require("fs");

export default async function newCaptcha(length: any) {
    let captcha = generateString();
    let binary: AudioBuffer;
    let err;
    txtomp3.getMp3(captcha, async(err: any, binaryStream: any) => {
        binary = binaryStream
    })
    return new Promise((resolve, reject) => {
        resolve(binary)
    })
}

He intentado mostrar en la consola binaryStream y captcha, pero no están indefinidos, mientras que cuando llamo a la función:

newCaptcha({ length: 1 }).then(binaryStream => {
    console.log(binaryStream)
}).catch(e => {
    console.error(e)
})

Devuelve undefined.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código proporcionado es que está utilizando una función de devolución de llamada dentro del método txtomp3.getMp3() para asignar un valor a la variable binary. Sin embargo, como esta es una operación asíncrona, la declaración de return en la función se ejecuta antes de que se pueda asignar un valor a binary.

    Para solucionar esto, txtomp3.getMp3() debe envolverse en una Promise que se resuelva con el valor de binary una vez que esté disponible. Aquí hay una versión actualizada de la función newCaptcha que debería funcionar como se espera:

    /** @ts-ignore eslint-disable */
    declare var require: any
    import generateString from "./Strings/GenerateString";
    var txtomp3 = require("text-to-mp3");
    const fs = require("fs");
    
    export default async function newCaptcha(length: any) {
      let captcha = generateString();
      let binaryPromise = new Promise<audiobuffer>((resolve, reject) => {
        txtomp3.getMp3(captcha, (err: any, binaryStream: any) => {
          if (err) reject(err);
          resolve(binaryStream);
        });
      });
      return binaryPromise;
    }
    

    Al devolver la binaryPromise en lugar de binary, permite al llamador esperar a que la Promise se resuelva y devuelva el valor correcto.

Comments are closed.