异步array.map()与异步npm包之间的差异[关闭]

问题描述 投票:2回答:1

[上下文]我在这里有一个循环,我将有760000个交互,因此我正在尝试对其进行优化。

[问题]在我的循环中,我正在使用异步array.map()函数

cells.map(async (cell) => {
        if (cell[0] === '!') continue;
        [...]//so much code here
        return someObj;
}

我看到了async包,但是我不知道什么是更快的“异步映射”功能或“异步”包?

[请,如果可以,请说明一种方法比其他方法更快的方法。

javascript node.js asynchronous async.js
1个回答
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。无论如何,如果您不想阻止foobar的执行,则可以使用promise或aync/await来解决此问题。

地图

我建议您在这种情况下使用forEach而不是map或链接使用filtermap。为什么?让我解释一下:

    当您要转换原始数据并以
  1. new数组获取结果时,使用Map方法。例如,假设您有一个名为people的数组,其中包含具有以下格式的对象:{name: 'X', lastName: 'Y', age: 23 },并且想要将namelastName的串联作为fullName属性,则可以使用map如下:people.map(person => { fullName: `${name} ${lastName}` });
  2. 另一方面,假设您想与至少18岁的人过滤数据。您可以使用filterpeople.filter(person => person.age > 18);

在您的特定情况下,可以使用以下方法链接的那些方法:

arr
.filter(cell => cell[0] ===  '!')
.map(/*so much code here*/);

[请注意,如果您的代码块-这里有太多代码-与数据转换无关,我鼓励您使用链接到forEachfilter而不是map

很抱歉,如果我不明白您的问题,那就是我对此的解释。编码愉快。

PS:如果您不知道`${expression}`,则称为template string

© www.soinside.com 2019 - 2024. All rights reserved.