异步 array.map() 和异步 npm 包之间的区别
difference between async array.map() and async npm package
[上下文]
我在这里有一个循环,我将有 760000 次交互,所以我正在尝试优化它。
[问题]
在我的循环中,我使用的是异步 array.map()
函数
cells.map(async (cell) => {
if (cell[0] === '!') continue;
[...]//so much code here
return someObj;
}
我看到了 async 包,但我不知道哪个更快,"async map" 函数还是 "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
方法用于转换原始数据以获得 new 数组中的结果。例如,假设您有一个名为 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*/);
请注意,如果您的代码块 - 这里有这么多代码 - 与数据转换无关,我鼓励您使用 forEach
链接到 filter
而不是 map
.
抱歉,如果我不明白你的问题,但这就是我对它的解释。编码愉快。
PS:不知道`${expression}`
的就叫template string.
[上下文]
我在这里有一个循环,我将有 760000 次交互,所以我正在尝试优化它。
[问题]
在我的循环中,我使用的是异步 array.map()
函数
cells.map(async (cell) => {
if (cell[0] === '!') continue;
[...]//so much code here
return someObj;
}
我看到了 async 包,但我不知道哪个更快,"async map" 函数还是 "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
方法用于转换原始数据以获得 new 数组中的结果。例如,假设您有一个名为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*/);
请注意,如果您的代码块 - 这里有这么多代码 - 与数据转换无关,我鼓励您使用 forEach
链接到 filter
而不是 map
.
抱歉,如果我不明白你的问题,但这就是我对它的解释。编码愉快。
PS:不知道`${expression}`
的就叫template string.