javascript - Encontrar elementos coincidentes en un array usando async/await y promise.all
El valor de filterdList.length siempre es igual al número total de elementos con el código a continuación. Por lo tanto, este método siempre devuelve falso. Solo hay un elemento en la tabla que coincide con el nombre dado.
async itemExists(name) : Promise<boolean>{
const itemList = await element.all(this.itemList)
const filterdList= await Promise.all(itemList.filter( async (item) =>{
let text = await item.getText();
if (text == name) {
return true;
}
}));
return await filterdList.length == 1;
}
llamando a este método como se indica a continuación
console.log(await itemExists('unique item name'));
Respuesta #1
await solo es necesario una vez dentro de una función async
async function itemExists(name) {
const itemList = await Promise.all(element.all(this.itemList)
.map(item => item.getText()));
const filterdList = itemList.filter(item => text === name);
return filterdList.length == 1;
}
itemsExists(name).then(bool => console.log(bool));
async function itemExists(name) {
const itemList = await Promise.all(['unique item name', 'not unique item name'].map(item => Promise.resolve(item)))
const filterdList = itemList.filter(item => item == name);
return filterdList.length === 1;
}
itemExists('unique item name').then(bool => console.log(bool));Respuesta #2
Esta línea está completamente equivocada: return await filterdList.length == 1;
Primero, parece que quieres devolver un Promise, no un boolean. No uses la palabra clave await en esa declaración si ese es tu objetivo. En segundo lugar, no puedes await un boolean. Solo puedes usar await en instancias de Promise. En su lugar, puedes hacer algo como var list=await filterdList, luego puedes verificar la longitud de list más adelante.
Recomiendo reconstruir este método desde cero y probar con declaraciones de console.log a lo largo del proceso. Te dará una mejor comprensión de lo que está yendo mal y dónde. Ten especial cuidado con lo que estás pasando a Promise.all. Si no es un arreglo de Promesas, entonces no se comportará correctamente.
Probablemente no deberías filtrar el arreglo hasta que todas las Promesas se hayan resuelto. Puedes obtener todos los nombres y luego filtrar. La línea de abajo mostrará los nombres de los elementos resueltos, los cuales puedes filtrar.
var itemNames = await Promise.all(itemList.map(item => item.getName()))
itemNames.filter(...).length
