> Faqs > Método asíncrono no devuelve ningún valor

Método asíncrono no devuelve ningún valor

Buenas tardes, estoy intentando hacer un método que me cuente el número de elementos que tiene un Array que empiece por “RT:”

Para ello he desarrollado el siguiente código:

public getRowsRTs(idProyecto){
    this.twitterService.getTargets().subscribe((data) => {
      this.Twitter = data;
    });
    let countRT = this.Twitter.filter( tweet => tweet.mensaje.startsWith("RT:")).length;
    return countRT
    }
}

Aquí, data me devuelve todos los Documentos que extrae Mongo, y me los mete en el Array de Twitter que tengo definido al principio del componente. Dentro de este Array cada elemento tiene diferentes atributos, como son _id, mensaje, fecha… yo lo que pretendo es que me cuente cuantos de esos documentos, el valor de mensaje, comienza por RT: y que me lo devuelva, este código, no me da ningún problema, pero no me devuelve absolutamente nada, no sé si alguien me podría ayudar.

Respuestas

En tu método tienes un problema debido a la naturaleza asíncrona de tu código, el que se ejecuta dentro del método getRowsRTs().

Date cuenta que this.twitterService.getTargets().subscribe() es una función asíncrona. Como tal, tardará un tiempo en ejecutarse, de modo que la variable this.twitter se llenará al cabo de unos instantes.

Entre tanto, antes que el método subscribe te proporcione ningún valor, se sigue ejecutando el resto del código del método, haciéndo la cuenta de los mensajes que comienzan con "RT:". El caso es que, cuando se ejcuta el filter sobre this.twitter no hay ningún valor en this.twitter (probablemente lo hayas inicializado como un array vacío, pero en cualquier caso nunca estarán los tuits, porque ese código se ejecuta instantáneamente, antes de recibir respuesta de tu servicio)

La solución pasa por devolver el valor de la cuenta de tuits solamente cuando se ha recibido la lista de tuits. Sin embargo, esto no podrías hacerlo a no ser que devuelvas una promesa que se resolverá más adelante, por ejemplo. Ahí ya depende de cómo te organices con tu código asíncrono.

Espero haberte ayudado.

Camila
680 29 46 6

Es un error típico de Javascript. No debemos olvidarnos de que la ejecución del código no es siempre secuencial.

Hay métodos asíncronos, que reciben funciones callback como en tu caso, que debes esperar a que se ejecuten para continuar.

function asincrona() {
    setTimeout( () => console.log('Hola'));
    console.log('Adios');
}
asincrona();

¿Qué aparece primero en la consola? ¿Hola o Adios?

No podemos leer el código de manera siempre secuencial en Javascript! En este caso se escribe primero en pantalla "Adios". De hecho, la función asincrona finaliza después de escribir "Adios" en la pantalla por lo que cualquier valor que necesitase devolverse como consecuencia del callback del setTimeout no se podría devolver. A no ser que uses promesas, claro.

Borja
325 6 27 17