【问题标题】:Is it legit to use .map() method only for side-effects?仅将 .map() 方法用于副作用是否合法?
【发布时间】:2021-03-24 22:35:59
【问题描述】:

是否合法(或良好做法)使用更高阶函数(如 Array.map())执行循环以执行一些副作用?

这主要是一个理论问题,因为我注意到有时我使用.map() 方法发现(或自己执行)一些循环,如下所示:

let myObject = {...}
let myItemsArray = [ ... , ... ]

myItemsArray.map( (item, index) => {
    // do some side effect for ex: 
    myObject.item[index] = item
}

但我知道这个map() 方法实际上返回了一个数组。所以调用myItemsArray.map() 就像我返回一个数组而不将它分配给任何变量。

那么问题来了,这合法吗?我应该避免这种情况并使用经典的for() 循环还是.forEach() 方法?

附带问题:我问这个的原因之一是因为我需要在异步函数上执行一些循环,因此涉及到 promise 和 await 运算符,我记得 forEach() 循环是在异步函数上并不理想,但想知道原因。

【问题讨论】:

  • 构建一个不需要的数组是没有意义的,改用forEach。但是,如果您正在执行异步操作,那么您可能确实需要该数组,因为这是Promise.all 用来解决所有承诺的原因。
  • 如果您不打算将任何内容实际映射到新数组,则应该使用 forEach
  • @jonrsharpe 谢谢,确实我的代码解决了一些承诺,所以 Promise.All() 最终得到结果

标签: javascript node.js loops higher-order-functions array.prototype.map


【解决方案1】:

那么问题来了,这合法吗?我应该避免这种情况并使用经典的 for() 循环还是 .forEach() 方法?

如果您没有从 map 函数返回任何内容,那么您应该改用 forEach。你最终得到了相同的结果,但你并不暗示任何维护你的代码的人,你正在返回一些有用的东西。

我问这个的原因之一是因为我需要在异步函数上执行一些循环,因此涉及承诺和等待运算符,我记得 forEach() 循环在异步函数上并不理想,但我想知道为什么。

forEachmap 都不会,如果您传递给它的函数返回一个承诺(async 函数会这样做),await

所以这里有三种可能的情况:

// Your loop
...myItemsArray...
// Code that comes after the loop
...etc...

A:循环中的项目需要按顺序处理

使用常规的for () 循环,因为外部函数不会暂停。

B:循环中的项目可以并行处理,后面的代码不需要等待

使用forEach

C:后面的代码需要等待循环中的所有内容完成

使用map。将返回的承诺数组传递给Promise.all。然后await那个。

【讨论】:

  • 哦,我现在明白了。所以forEach() 就像这里最“不稳定”的方法,对吧?我不知道它是并行运行的。总是认为它就像for() 循环。所以我猜不返回任何内容 forEach() 也会保持内存清洁?在哪里使用 map 而不是在变量上暗示它返回的数组可以保留在会话的内存中?
  • 除非你await 什么东西,否则循环中的任何异步都将并行完成。使用forawait 将暂停整个循环。使用forEach,它将暂停该特定功能,但同时循环将继续处理其他数据。
  • “所以我猜测不返回任何内容 forEach() 也会保持内存清洁?” — 没有。
猜你喜欢
  • 1970-01-01
  • 2014-06-21
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
  • 2023-01-26
相关资源
最近更新 更多