[上下文]我在这里有一个循环,我将有760000个交互,因此我正在尝试对其进行优化。
[问题]在我的循环中,我正在使用异步array.map()
函数
cells.map(async (cell) => {
if (cell[0] === '!') continue;
[...]//so much code here
return someObj;
}
我看到了async包,但是我不知道什么是更快的“异步映射”功能或“异步”包?
[请,如果可以,请说明一种方法比其他方法更快的方法。
您听说过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
的串联作为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*/);
[请注意,如果您的代码块-这里有太多代码-与数据转换无关,我鼓励您使用链接到forEach
的filter
而不是map
。
很抱歉,如果我不明白您的问题,那就是我对此的解释。编码愉快。
PS:如果您不知道`${expression}`
,则称为template string。