【问题标题】:Find matching elements in array using async/await and promise.all使用 async/await 和 promise.all 在数组中查找匹配元素
【发布时间】:2018-03-25 00:25:25
【问题描述】:

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

【问题讨论】:

  • name 定义在哪里?
  • name 作为参数传递给此方法。
  • 什么是itemList?我不认为它的filter 方法会接受一个返回承诺的回调。
  • 您绝对不需要(也不应该)await filterdList.length == 1 比较的布尔结果。
  • itemListPromise 值的数组还是 Promises 的数组?

标签: javascript typescript async-await protractor


【解决方案1】:

awaitasync 函数中只需要一次

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

【讨论】:

  • 在类型脚本中实现此功能时出现以下错误。有什么线索吗? [ts] Argument of type 'Promise&lt;{}[]&gt;' is not assignable to parameter of type 'Iterable&lt;{} | PromiseLike&lt;{}&gt;&gt; | PromiseLike&lt;Iterable&lt;{} | PromiseLike&lt;{}&gt;&gt;&gt;'.@guest271314
  • 整理出来const itemExists = async (elementAll: ElementArrayFinder, name: string) =&gt; { const fn = await elementAll.map((elm: ElementFinder) =&gt; { return elm.getText() }); const itemList = await PromiseBB.all(fn); const filterdList = itemList.filter(item =&gt; item === name); return filterdList.length == 1; }
  • "Await 只需要在异步函数中执行一次" 这里就是这种情况,但一般情况下不是这样。如果你在等待另一个承诺,你必须等待它。
【解决方案2】:

这一行是各种错误:return await filterdList.length == 1;

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

我建议从头开始重建此方法,并使用 console.log 一路上的声明。它将让您更好地了解出了什么问题,以及哪里出了问题。请特别注意您传递给Promise.all 的内容。如果它不是一个 Promise 数组,那么它的行为就不会正确。

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

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

【讨论】:

    猜你喜欢
    • 2022-11-23
    • 1970-01-01
    • 2018-12-26
    • 2017-09-14
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多