[上下文]
我在这里有一个循环,我将有760000个交互,因此我正在尝试对其进行优化。
[问题]
在我的循环中,我正在使用异步array.map()
函数
cells.map(async (cell) => {
if (cell[0] === '!') continue;
[...]//so much code here
return someObj;
}
我看到了async软件包,但是我不知道什么是更快的“异步映射”函数或“异步”软件包?
请(如果可以)说明一种方法比另一种方法更快的方法。
答案 0 :(得分:2)
您听说过promises吗?如果您认为映射会花费太长时间,并且想要执行以下不需要该数组结果的代码(即独立代码),则可以使用一个承诺来包装它,以更改执行流程。
const heavyMapping = arr => Promise.resolve(
arr.map(cell => {
if (cell[0] === '!') continue;
[...]//so much code here
return someObj;
})
);
//Call the function.
heavyMapping(arr).then((result) => processResult(result));
//Rest of your program
foo();
bar();
因此执行将类似于:heavyMapping -> foo -> bar ... -> processResult
。如果您在不使用异步代码的情况下运行代码,则该代码将为heavyMapping -> ... -> processResult -> foo -> bar
。请注意,如果您使用的是异步代码,这并不意味着您的代码将并行执行,因为这是并发编程和并行性,这是并发的特殊情况,其中您有足够的硬件来同时执行这两项任务。进一步了解:https://medium.com/@deepshig/concurrency-vs-parallelism-4a99abe9efb8。无论如何,如果您不想阻止foo
和bar
的执行,则可以使用promise或aync/await
来解决此问题。
在这种情况下,或者使用forEach
和map
链接的情况下,建议您使用filter
代替map
。为什么?让我解释一下:
Map
方法。例如,假设您有一个名为people
的数组,其中包含以下格式的对象:{name: 'X', lastName: 'Y', age: 23 }
,并且您想将name
和lastName
的连接作为{ {1}}属性,则可以如下使用fullName
:map
。people.map(person => { fullName: `${name} ${lastName}` });
:filter
。在您的特定情况下,可以使用以下方法链接的那些方法:
people.filter(person => person.age > 18);
请注意,如果您的代码块-此处的代码太多-与数据转换无关,我鼓励您使用链接到arr
.filter(cell => cell[0] === '!')
.map(/*so much code here*/);
的{{1}}而不是forEach
。
很抱歉,如果我不明白您的问题,那就是我对此的解释。编码愉快。
PS:如果您不了解filter
,则称为template string。