2017-10-12 61 views
3

filterdList.length值总是等于下面代码的元素总数。所以这个方法总是返回false。表中只有一个与给定名称匹配的项目。使用async/await和promise查找数组中的匹配元素

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; 
} 

调用此方法如下

console.log(await itemExists('unique item name')); 
+0

凡'name'定义之内? – guest271314

+0

名称作为参数传递给此方法。 – Karthi

+0

什么是'itemList'?我不认为它的'过滤器'方法会带来承诺 - 回传回调。 – Bergi

回答

3

await只需要一次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));

+0

在类型脚本中实现此功能时出现以下错误。任何线索? '[ts]类型'Promise <{}[]>'的参数不能分配给类型为'Iterable <{} |“的类型的参数。 PromiseLike <{}>> | PromiseLike >>'@ guest271314 – Galileo123

+0

对它进行了整理:const itemExists = async(elementAll:ElementArrayFinder,name:string)=> const fn = await elementAll.map((elm:ElementFinder)=> {return elm。 getText()}); const itemList = await PromiseBB.all(fn); const filterdList = itemList.filter(item => item === name); return filterdList.length == 1; }' – Galileo123

+0

“在异步功能中只需要等待一次” 这就是这种情况,但不是一般情况。如果你正在等待另一个承诺,你必须等待它。 – phillyslick

2

这条线是各类错误的:return await filterdList.length == 1;

首先,它看起来像你想返回一个Promise,而不是一个boolean。如果这是您的目标,请不要在该声明中使用await关键字。其次,你不能await a boolean。您只能在Promise实例上使用await。相反,您可以执行诸如var list = await filterdList之类的操作,稍后您可以检查list的长度。

我建议从头开始重建此方法,并使用 console.log声明一路测试。它会让你更好地了解发生了什么问题,以及在哪里。要特别小心你传递给Promise.all的东西。如果它不是Promises数组,那么它的行为就不会正确。

您应该不会过滤数组,直到所有的Promise都解决。你可以得到所有的名字,然后过滤。下面一行将输出已解析的项目名称,您可以通过该名称进行过滤。

var itemNames = await Promise.all(itemList.map(item => item.getName())) 
itemNames.filter(...).length