[上下文]
我这里有一个循环,我将有 760000 次交互,所以我正在尝试优化它。
[问题]
在我的循环中,我使用异步 array.map()
功能
cells.map(async (cell) => {
if (cell[0] === '!') continue;
[...]//so much code here
return someObj;
}
我看到了async包,但我不知道哪个更快,“异步映射”函数还是“异步”包?
如果可以的话,请解释一下为什么一种方法比另一种方法更快。
最佳答案
异步代码
您听说过 promises ?如果您认为您的映射将花费太长的时间,并且您想要执行以下不需要该数组结果的代码,即独立代码,那么您可以使用 Promise 来包装它以更改执行流程。
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
来面对这个问题.
map
在这种特殊情况下,我建议您使用 forEach
而不是 map
或使用 filter
和 map
链式。为什么?让我解释一下:
-
当您想要转换原始数据以获取新数组中的结果时,可以使用
Map
方法。例如,假设您有一个名为people
的数组,其中包含以下格式的对象:{name: 'X', lastName: 'Y',age: 23 }
并且您希望将name
和lastName
的串联作为fullName
属性,那么您可以使用map
作为如下:people.map(person => { fullName: `${name} ${lastName}` });
。- 另一方面,假设您想要过滤年满 18 岁的人员的数据。您可以使用
filter
来实现:people.filter(person => person.age > 18);
。
在您的特定情况下,您可以使用如下链接的这些方法:
arr
.filter(cell => cell[0] === '!')
.map(/*so much code here*/);
请注意,如果您的代码块 -这里有这么多代码 - 与数据转换无关,我鼓励您使用链接到 filter 的
而不是forEach
map
。
抱歉,如果我不明白你的问题,但这就是我对此的解释。快乐编码。
PS:如果你不知道`${表达式}`
,它叫template string .
关于javascript - async array.map() 和 async npm 包之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51051564/