异步array.map()和异步npm包的区别

时间:2018-06-26 21:25:12

标签: javascript node.js asynchronous async.js

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

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

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

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

请(如果可以)说明一种方法比另一种方法更快的方法。

1 个答案:

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

地图

在这种情况下,或者使用forEachmap链接的情况下,建议您使用filter代替map。为什么?让我解释一下:

    当您要转换原始数据并以 new 数组的形式获取结果时,使用
  1. Map方法。例如,假设您有一个名为people的数组,其中包含以下格式的对象:{name: 'X', lastName: 'Y', age: 23 },并且您想将namelastName的连接作为{ {1}}属性,则可以如下使用fullNamemap
  2. 另一方面,让我们假设您要与至少18岁的人一起过滤数据。您可以为此使用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