Javascript Nodejs使用async/bluebird打破循环?

Javascript Nodejs使用async/bluebird打破循环?,javascript,node.js,performance,loops,Javascript,Node.js,Performance,Loops,所以,我有下面的代码可以工作,但我希望它不再使用for循环 重要的一点是“突破”的故事 我用蓝鸟试过了,但失败了。Array.prototype.forEach不是选项,无法停止 我还能试什么 编辑:点正在填充对象列表,“未定义”对象。该列表表示在故意填充的映射中未找到的项 所以,他们中的一大群人都被测试了一场比赛 如果找到了项,我们应该跳到下一组。当然:停止在项目上循环,因为我们找到了匹配项,所以继续下去没有意义。不需要继续检查所有剩余的项目,很可能是几十万 EDIT2:“notDefined

所以,我有下面的代码可以工作,但我希望它不再使用for循环

重要的一点是“突破”的故事

我用蓝鸟试过了,但失败了。Array.prototype.forEach不是选项,无法停止

我还能试什么

编辑:点正在填充对象列表,“未定义”对象。该列表表示在故意填充的映射中未找到的项

所以,他们中的一大群人都被测试了一场比赛

如果找到了项,我们应该跳到下一组。当然:停止在项目上循环,因为我们找到了匹配项,所以继续下去没有意义。不需要继续检查所有剩余的项目,很可能是几十万

EDIT2:“notDefined”列表的目的是将对象写入文本文件,稍后可以手动检查该文本文件

变量名已从原来的名称更改为其他名称,以便在此处显示不同的内容

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

此数据以多个CSV文件的形式输入。它们都被读取,并且每个CSV文件都会生成一个列表。此CSV文件中的数据为:

  • 绝对文件路径
  • 文件大小
  • Md5
以及其他一些元数据

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

因此,我们为机器A提供了几个CSV文件,然后为机器B提供了几个CSV。我们希望看看在机器A上找到的项目是否也可以在机器B上找到

这就是我在这里要做的:遍历所有CSV并找到匹配的项目

如果我找到了匹配项,那么就没有必要继续检查,我可以跳到下一组。这就是
中断的地方来自


但我确实需要检查每个匹配项,然后为所有找不到的项编写结果。

在我看来,您有两个数组,
对象

而且,在我看来,您需要一种性能良好的方法来了解所有贴图中是否缺少每个对象。我想你对打破for循环的兴趣是你让它正常运行的策略的一部分

我可以建议另一种方法吗?让我们从创建一组所有贴图对象中的所有关键点开始。像这样的

const allKeys = new Set()
for (const item of items)
  for (const key of item.keys())
    allKeys.add(key)
现在,您一个接一个地运行对象数组,并将它们推入
notDefined
,如果它们不在
allKeys
集中

for (const obj of objects)
  if (!allKeys.has(obj)) 
    notDefined.push(obj)
这将使您摆脱两个数组上的嵌套迭代。它的性能很好,因为设置查找速度很快

总之,在一些完全同步的紧循环中(无需承诺):


<>为了使它更快,您可以考虑在您的CSV文件中读取原始数据时,构建<代码> ALKEY < /代码> SET。这将保存对
项的所有元素的传递,在我看来,您有两个数组,
对象和

而且,在我看来,您需要一种性能良好的方法来了解所有贴图中是否缺少每个对象。我想你对打破for循环的兴趣是你让它正常运行的策略的一部分

我可以建议另一种方法吗?让我们从创建一组所有贴图对象中的所有关键点开始。像这样的

const allKeys = new Set()
for (const item of items)
  for (const key of item.keys())
    allKeys.add(key)
现在,您一个接一个地运行对象数组,并将它们推入
notDefined
,如果它们不在
allKeys
集中

for (const obj of objects)
  if (!allKeys.has(obj)) 
    notDefined.push(obj)
这将使您摆脱两个数组上的嵌套迭代。它的性能很好,因为设置查找速度很快

总之,在一些完全同步的紧循环中(无需承诺):


<>为了使它更快,您可以考虑在您的CSV文件中读取原始数据时,构建<代码> ALKEY < /代码> SET。这将节省对
项的所有元素的传递

而不是希望“不再使用循环”,您实际需要做什么?因为使用promises(不再需要bluebird了,在浏览器和节点本机不支持它们的时候,这个库是有意义的)。您展示的代码非常奇怪,因为它似乎并不关心它发现了什么,只关心“any object”中的“some property”,没有进一步的解释,它几乎是无用的:您能描述一下您具体想要做什么吗,因为可能有一种非常简单的方法可以做到这一点,但您没有考虑。异步代码在哪里?@Mike'Pomax'Kamermans补充了一些解释。@VLAZ async/await是一种可能的解决方案。它还不在那里,我也不记得写过。我不是说关键字
wait
-这段代码的哪一部分是异步的?你提到你用蓝鸟试过,但你用蓝鸟试过什么?这段代码的哪一部分需要异步处理?与其希望“不再使用循环”,您实际需要做什么?因为使用promises(不再需要bluebird了,在浏览器和节点本机不支持它们的时候,这个库是有意义的)。您展示的代码非常奇怪,因为它似乎并不关心它发现了什么,只关心“any object”中的“some property”,没有进一步的解释,它几乎是无用的:您能描述一下您具体想要做什么吗,因为可能有一种非常简单的方法可以做到这一点,但您没有考虑。异步代码在哪里?@Mike'Pomax'Kamermans补充了一些解释。@VLAZ async/await是一种可能的解决方案。它还没有在里面,我也不记得写过。我很高兴