javascript - async array.map() 和 async npm 包之间的区别

标签 javascript node.js asynchronous async.js

[上下文]
我这里有一个循环,我将有 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 。无论如何,如果你不想阻止 foobar 的执行,你可以使用 Promise 或 aync/await 来面对这个问题.

map

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

    当您想要转换原始数据以获取数组中的结果时,可以使用
  1. Map方法。例如,假设您有一个名为 people 的数组,其中包含以下格式的对象:{name: 'X', lastName: 'Y',age: 23 }并且您希望将 namelastName 的串联作为 fullName 属性,那么您可以使用 map 作为如下: people.map(person => { fullName: `${name} ${lastName}` });
  2. 另一方面,假设您想要过滤年满 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/

相关文章:

javascript - AngularJS:搜索从服务中的 promise 返回的数组

javascript - 如何使 React Native Webview 自动高度

Node.js、Synchronize.js 和返回值

c# - 如何在 Windows 服务中实现连续的生产者-消费者模式

javascript - 异步函数调用中的共享变量

javascript - Windows 10 为浏览器的用户代理设置了什么操作系统名称?

arrays - 在查询嵌套对象中的字段和字段时设置条件

javascript - Node 记录未捕获的异常(Winston V3)

javascript - 在函数内部修改变量后,为什么变量未更改? -异步代码引用

javascript:将方法和字符串分配给相同的属性名称