javascript - async/await ve promise.all kullanarak dizide eşleşen öğeleri bul
filterdList.length değeri aşağıdaki kod ile her zaman toplam eleman sayısına eşittir. Bu yüzden bu yöntem her zaman false döndürüyor. Verilen isimle eşleşen tabloda sadece bir öğe var.
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;
}
bu yöntemi aşağıdaki gibi çağırmak
console.log(await itemExists('unique item name'));
Cevap #1
await yalnızca bir async fonksiyon içinde bir kez gereklidir
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));Cevap #2
Bu satır her yönden yanlış: return await filterdList.length == 1;
İlk olarak, görünüşe göre bir Promise döndürmek istiyorsunuz, bir boolean değil. Eğer amacınız buysa, o ifadede await anahtar kelimesini kullanmayın. İkinci olarak, bir boolean üzerinde await kullanamazsınız. await sadece Promise örneklerinde kullanılabilir. Bunun yerine, şunu yapabilirsiniz: var list=await filterdList, ardından list'in uzunluğunu daha sonra kontrol edebilirsiniz.
Bu yöntemi baştan yeniden oluşturmanızı ve yol boyunca console.log ifadeleri ile test etmenizi tavsiye ederim. Bu, neyin yanlış gittiğini ve nerede olduğunu daha iyi anlamanızı sağlayacaktır. Özellikle Promise.all'a ne gönderdiğinize dikkat edin. Eğer bu bir Promise dizisi değilse, doğru şekilde çalışmayacaktır.
Muhtemelen, tüm Promiseler çözülene kadar diziyi filtrelememelisiniz. Önce tüm isimleri alabilir, sonra filtreleyebilirsiniz. Aşağıdaki satır, filtreleyebileceğiniz çözülmüş öğe isimlerini çıkartacaktır.
var itemNames = await Promise.all(itemList.map(item => item.getName()))
itemNames.filter(...).length
