const result = [1, 2, 3, 4, 5].filter(async (n) => n <= 3)
Si consola. log (resultado) obtiene [1, 2, 3, 4, 5]. ¿Por qué no es [1, 2, 3]?
Si elimina async de la función, obtiene [1, 2, 3].
Sólo quiero saber por qué funciona así.
filter crea una nueva matriz con todos los valores de la matriz original donde la función que pasa devuelve un valor verdadero .
las funciones async devuelven promesas. Las promesas son objetos. Los objetos son valores verdaderos .
Si desea hacer esto con funciones asíncronas, deberá esperar hasta que haya resuelto las promesas antes de probar la veracidad.
!async function() { const data = [1, 2, 3, 4, 5]; const promises = data.map(async(n) => ({ value: n, include: n <= 3 })); const data_with_includes = await Promise.all(promises); const filtered_data_with_includes = data_with_includes.filter(v => v.include); const filtered_data = filtered_data_with_includes.map(data => data.value); console.log(filtered_data); }();O, en un formato que no explica cada paso:
!async function() { const result = (await Promise.all([1, 2, 3, 4, 5].map(async(n) => ({ value: n, include: n <= 3 })))).filter(v => v.include).map(data => data.value); console.log(result); }(); También podría evitar usar los métodos funcionales a favor de la mutación en un bucle for
!async function() { const test = async(n) => n <= 3; const data = [1, 2, 3, 4, 5]; const result = []; for (let i = 0; i < data.length; i++) { const value = data[i]; if (await test(value)) result.push(value); } console.log(result); }();