【问题标题】:Nodejs break out of loop with async/bluebird?Nodejs 用 async/bluebird 跳出循环?
【发布时间】:2020-04-02 15:33:56
【问题描述】:

所以,我得到了以下代码,但我希望它不再使用 for 循环。

重要的是“打破”故事。

    for (const obj of objects) {
        let found = false;

        for (const item of items) {
            const result = item.get(obj);
            if (typeof result !== 'undefined') {
                found = true;
                break;
            }
        }

        if (!found) {
            notDefined.push(obj);
        }
    }

我已经用 Bluebird 尝试过,但我失败了。 Array.prototype.forEach 不是一个选项,它无法停止。

我还能尝试什么?

编辑:重点是填充对象列表,即“未定义”对象。该列表表示地图中未找到的项目,这些项目已被有意填充。

所以他们中的一堆被测试匹配。

如果项目确实被找到,我们应该跳到下一组。当然:停止循环遍历这些项目,因为我们找到了匹配项,因此继续没有意义。不需要一直检查所有剩余的项目,可能有几十万。

EDIT2:“未定义”列表的目的是将对象写入文本文件,以后可以手动检查。

变量名称已与原来的不同,这里有一些不同的东西。

代码的目的是将一台机器上多个目录的内容与另一台机器上多个目录的内容进行比较。

这些数据以多个 CSV 文件的形式出现。它们都被读取并为每个 CSV 文件生成一个列表。此 CSV 文件中的数据为:

  • 绝对文件路径
  • 文件大小
  • Md5

还有其他一些元数据。

但是,这个列表每次都不仅仅包含绝对文件路径的字符串,它还包含一个Map(),键是上面提到的3条数据的组合。

所以我们有几个用于机器 A 的 CSV 文件,然后有几个用于机器 B 的 CSV。我们希望看看在机器 A 上找到的项目是否也可以在机器 B 上找到。

这就是我在这里尝试做的事情:遍历所有 CSV 并找到匹配的项目。

如果我找到匹配项,则没有必要继续检查,我可以跳到下一组。这就是break; 的来源。

但我确实需要检查每一个匹配项,然后为在任何地方找不到的所有项目写一个结果。

【问题讨论】:

  • 不想“不再使用循环”,您实际上需要做什么?因为使用了 Promise(这不太可能不再需要 bluebird,当浏览器和节点本身不支持它们时,这是一个有意义的库)。您显示的代码非常好奇,因为它似乎并不关心它发现了什么,只是“某些属性”在“任何对象”中,没有进一步解释感觉几乎没用:你能具体描述一下你是什么吗尝试这样做,因为可能有一种您没有考虑过的非常简单的方法。
  • 这里的异步代码在哪里?
  • @Mike'Pomax'Kamermans 添加了更多解释。
  • @VLAZ async/await 是一种可能的解决方案。它还没有,我也不记得曾经写过。
  • 我不是在谈论关键字await——这段代码的哪一部分是异步的?你提到你用 Bluebird 尝试过,但你用 Bluebird 试过 what?这段代码的哪一部分需要异步处理?

标签: javascript node.js performance loops


【解决方案1】:

在我看来,您有两个数组,objectsitems

而且,在我看来,您需要一种性能良好的方法来了解您的所有地图中的每个对象是否缺失。我想您对打破 for 循环的兴趣是您使其表现得体的策略的一部分。

我可以建议另一种方法吗?让我们从所有 Map 对象中所有键的单个 Set 开始。像这样。

const allKeys = new Set()
for (const item of items)
  for (const key of item.keys())
    allKeys.add(key)

现在,您将一个一个地遍历对象数组,如果它们不在 allKeys 集合中,则将它们推入 notDefined

for (const obj of objects)
  if (!allKeys.has(obj)) 
    notDefined.push(obj)

这使您摆脱了两个数组的嵌套迭代。而且它的性能很好,因为 Set 查找速度很快。

一起,在一些完美同步的紧密循环中(不需要 Promise):

const allKeys = new Set()
for (const item of items)
  for (const key of item.keys())
    allKeys.add(key)

for (const obj of objects)
  if (!allKeys.has(obj))
     notDefined.push(obj)

为了使其更快,您可以考虑在从 CSV 文件中读取原始数据时构建您的 allKeys 集。这将保存对items 的所有元素的传递。

【讨论】:

    猜你喜欢
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 2021-08-31
    • 2017-08-23
    • 2012-01-16
    • 2020-05-21
    • 2015-04-26
    相关资源
    最近更新 更多