使用async / await和promise.all查找数组中的匹配元素

时间:2017-10-12 23:11:41

标签: javascript typescript async-await protractor

filterdList.length值总是等于具有以下代码的元素总数。所以这个方法总是返回false。表中只有一个项与给定名称匹配。

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'));

2 个答案:

答案 0 :(得分: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));

&#13;
&#13;
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));
&#13;
&#13;
&#13;

答案 1 :(得分:2)

这一行有各种错误:Promise

首先,您似乎想要返回boolean,而不是await。如果这是您的目标,请不要在该语句中使用await关键字。其次,你不能boolean一个await。您只能在Promise个实例上使用var list = await filterdList。相反,您可以执行list之类的操作,然后您可以稍后检查console.log的长度。

我建议从头开始重建此方法,并进行测试 一路上Promise.all陈述。它将使您更好地了解出错的地方和地点。关于你传递给var itemNames = await Promise.all(itemList.map(item => item.getName())) itemNames.filter(...).length 的内容要特别小心。如果它不是一个Promises数组,那么它就不会表现得正确。

在所有Promise都解决之前,您可能不应该过滤数组。您可以获取所有名称,然后过滤。下面的行将输出已解析的项目名称,您可以对其进行过滤。

import re
data = re.findall("\<(.*?)\>", string)